题目链接:http://www.51nod.com/contest/problem.html#!problemId=1616
题解:该怎么做这题呢。。我比赛时候想了半天,问了舍友才知道,抱大腿QAQ。
设f[i]表示i有多少个倍数在集合内,设我们当前枚举的数是X,如果b[x]=b[kx](k>1)则x肯定不是任意两个数的最大公因数。时间复杂度不会算。。。。。
#include<cstdio>
const int N=1000001;
int a[N],b[N];
int read()
{
int s=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')s=s*10+c-'0',c=getchar();
return s;
}
int ok(int x)
{
if(a[x])return 1;
if(!b[x])return 0;
for(int i=x<<1;i<N;i+=x)
{
if(b[x]==b[i])
return 0;
}
return 1;
}
int main()
{
int i,j,n,ans=0;
n=read();
for(i=0;i<n;i++)
a[read()]=1;
for(i=1;i<N;i++)
{
for(j=i;j<N;j+=i)
b[i]+=a[j];
}
for(i=1;i<N;i++)
ans+=ok(i);
printf("%d\n",ans);
return 0;
}