因为注意到值域只有1e6而gcd只能有倍数取出所以对于每一个数探究是否能出现在数组中,方法一直接出现,二从其倍数gcd出现,而大的数字出现会可能影响小的gcd所以逆序取。
#include<bits/stdc++.h>
using namespace std;
int n,t,x,ans,i,j,temp;
bool vis[1000005];
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
void solve()
{
for(i=1e6;i>=1;--i)
{
if(vis[i])
ans++;
else {
temp=0;
for(j=2;j*i<=1e6;++j)
{
if(vis[i*j])
temp=gcd(temp,i*j);
}
if(temp==i)
{
vis[i]=1;
ans++;
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
vis[x]=1;
}
ans=0;
solve();
printf("%d\n",ans-n);
return 0;
}