题意
给出n个数字,询问从中挑出k个数字,最大可能的公共gcd是多少。
题解
k个数的gcd一定出现至少k次。
我们遍历所有的数并对每个数字求它所有的因子,统计各个因子出现的个数。
给定k时,我们的答案就是所有出现次数>=k的因子的最大值。
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int cnt[1000001];
int ans[1000001];
int main(){scanf("%d",&n);for(int i = 1;i <= n;++i){int tmp;scanf("%d",&tmp);for(int i = 1;i*i <= tmp;++i){if(tmp % i != 0) continue;int p = tmp / i;if(i*i == tmp){cnt[i]++;ans[cnt[i]] = max(ans[cnt[i]],i);} else{cnt[i]++;ans[cnt[i]] = max(ans[cnt[i]],i);cnt[p]++;ans[cnt[p]] = max(ans[cnt[p]],p);}}}for(int i = 1;i <= n;++i){printf("%d\n",ans[i]);}return 0;
}