题目D. Coprime

给定n个正整数数组a1,a2,…,an(1≤ai≤1000)。求i+j的最大值,使ai和aj为互素,†或−1(如果不存在i, j)。
例如,考虑数组[1,3,5,2,4,7,7]。i+j可以得到的最大值是5+7,因为a5=4和a7=7是互素。
†两个整数p和q是互素,如果它们的除数只有一个正整数为1(即它们的最大公约数为1)。
输入:
输入由多个测试用例组成。第一行包含一个整数t(1≤t≤10)——测试用例的数量。下面是测试用例的描述。
每个测试用例的第一行包含一个整数n(2≤n≤2⋅105)——数组的长度。
下面一行包含n个用空格分隔的正整数a1, a2,…, an(1≤ai≤1000)——数组的元素。
保证所有测试用例的n之和不超过2⋅105。
输出:
对于每个测试用例,输出单个整数- i+j的最大值,使i和j满足ai和aj是互素的条件,或输出−1,如果i和j不满足条件。

样例

input

6
3
3 2 1
7
1 3 5 2 4 7 7
5
1 2 3 4 5
3
2 2 4
6
5 4 3 15 12 16
5
1 2 2 3 6

output

6
12
9
-1
10
7

请注意
对于第一个测试用例,我们可以选择i=j=3,指标的和等于6,因为1和1是互素。
对于第二个测试用例,我们可以选择i=7和j=5,指标之和等于7+5=12,因为7和4是互素。

#include <bits/stdc++.h>
using namespace std;

#define int long long

int a[200010];
int st[1010];
vector<vector<int> > o(1010,vector<int>(1010,0));
int pos[1010];

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	for(int i=1;i<=1001;i++)
	{
		for(int j=1;j<=i;j++)
		{
			if(__gcd(i,j)==1)
			{
				o[i].push_back(j);
				o[j].push_back(i);//预处理,保存与其互质的数
			}
		}
	}
	while(t--)
	{
		int n;
		cin>>n;
		memset(pos,-1,sizeof pos);
		
		for(int i = 1;i <= n;i ++)
		{
			cin>>a[i];
			pos[a[i]]=max(pos[a[i]],i);//保存最后一个出现的位置
		}
		int ans=0;
		bool flag = false;
		for(int i = 1;i <= n;i ++)
		{
			for(auto x:o[a[i]])
			{
				if(pos[x] != -1&&flag == false) flag = true;
				ans = max(ans, pos[x] + i);
			}
		}
		if(flag) cout<<ans<<endl;
		else cout<<-1<<endl;
	}
}```

原文地址:http://www.cnblogs.com/dyb666/p/16790243.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性