题目梗概
现在有一个集合,对于任意的x,y,gcd(x,y)也在这个集合中。
给出原集合中一部分的数,求原集合的最小大小。
解题思路
因为ai的范围感人,所以肯定能枚举原集合中元素然后判断是否存在。
考虑如何判断。
显然只要关于
x
的倍数的
所以暴力维护就可以了。
#include<cstdio>
#include<cmath>
using namespace std;
char nc(){
static char buf[100000],*l=buf,*r=buf;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
if (l==r) return EOF;return *l++;
}
inline int _read(){
int num=0;char ch=nc();
while(ch<'0'||ch>'9') ch=nc();
while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=nc();
return num;
}
const int maxn=1000005;
int gcd(int x,int y){if (!y) return x;return gcd(y,x%y);}
int a[maxn],n,ans;
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
n=_read();
for (int i=1;i<=n;i++){
int x=_read();
for (int j=1;j<=sqrt(x);j++)
if (x%j==0) a[j]=gcd(a[j],x),a[x/j]=gcd(a[x/j],x);
}
for (int i=1;i<=1000000;i++)
if (i==a[i]) ans++;
printf("%d\n",ans);
return 0;
}