传送门:https://www.luogu.org/problemnew/show/P1414
之前打CF的时候做过这个题,然而没补,不会写。
一串序列的最大公约数就是序列中每个数的最大因子,我们把因子筛出来,
然后根据序列中的最大值倒着for一遍,如果某个因数出现的次数大于i,那么i个人的解就是这个数。
下面是代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+7;
int a[maxn];
int main()
{
int n;
cin>>n;
int mx = 0;
for(int i=0;i<n;i++)
{
int tmp;
cin>>tmp;
mx = max(mx,tmp);
for(int j=1;j*j<=tmp;j++)
{
if(tmp%j==0)
{
a[j]++;
if(j*j!=tmp)
{
a[tmp/j]++;
}
}
}
}
int p = 1;
for(int i=mx;i;i--)
{
while(a[i]>=p)
{
p++;
cout<<i<<endl;
}
}
return 0;
}
数论一点也不了解,这种题就无从下手。