题意
给出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;
}