B-Random

Random

https://ac.nowcoder.com/acm/contest/120563/B

一、输入输出描述如图所示

alt 二、核心思路

因为输入数据最大不超过1e9,sqrt(1e9)≈31622.78,所以可先使用欧拉筛,将所有不超过32000的质数记录进prime数组中。然后遍历每组输入数据,将每个数据分解质因数,并用map开一个数组,记录所出现过的质因子,一旦同一个质因子出现两次,则这两个数的必有两数的最大公约数是大于1,此时输出两数并结束循环,同时记录特殊情况:因为再对每个数分解质因数时,只分解了所有<=sqrt(x)的数,所以如果分解后的结果是大于1的,则也需将其记录map数组中。

三、代码

```#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M = 32000;
int prime[M] = {0};
bool vis[M];
void isPrime() {
	for (int i = 2; i <= M; i++) {
		if (!vis[i]) {
			prime[++prime[0]] = i;
		}
		for (int j = 1; j <= prime[0] && prime[j]*i <= M; j++) {
			vis[prime[j]*i] = true;
			if (i % prime[j] == 0)
				break;
		}
	}
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	isPrime();
	while (T--) {
		int n;
		cin >> n;
		vector<int> a(n + 2, 0);
		map<int, int> mp;
		int f = 0, f_o = 0;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
			if (f)
				continue;
			int t = a[i];
			if (t % 2 == 0 && f_o) {
				cout << a[f_o] << " " << t << "\n";
				f = 1;
			} else if (t % 2 == 0) {
				f_o = i;
				mp[2] = i;
			}
			if (f == 0 ) {
				for (int k = 1; k <= prime[0] && prime[k]*prime[k] <= t; k++) {
					if (t % prime[k] == 0) {
						if (mp[prime[k]] && mp[prime[k]] != i) {
							cout << a[mp[prime[k]]] << " " << a[i] << "\n";
							f = 1;
							break;
						} else if (mp[prime[k]] == 0)
							mp[prime[k]] = i;
						while (t % prime[k] == 0) {
							t /= prime[k];
						}
					}
				}
			}
			if (f == 0 && t != 1) {
				if (mp[t] && mp[t] != i) {
					cout << a[mp[t]] << " " << a[i]<<endl;
					f = 1;
				} else {
						mp[t] = i;
				}
			}
		}
		if (f == 0)
			cout << -1 << "\n";
	}
	return 0;
}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务