Pagini recente » Cod sursa (job #2077657) | Cod sursa (job #3174737) | Cod sursa (job #1332998) | Cod sursa (job #1851360) | Cod sursa (job #882860)
Cod sursa(job #882860)
#include <cstdio>
#include<bitset>
using namespace std;
bitset<1000010> B,BB;
int i,j,n,y,z,k,F[1000010];
long long SOL;
void back(int,int,int);
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
for(i=3;i<=1000;i+=2)
{
if(!F[i])
{
F[i]=i;
for(j=i*i;j<=1000000;j+=2*i)F[j]=i;
}
}
for(;i<=1000000;i+=2)
if(!F[i])F[i]=i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&y);
BB[y]=1;
if(y%2==0){B[2]=1;while(y%2==0)y/=2;}
for(;y>1;)
{
z=F[y];
B[z]=1;
while(y%z==0)y/=z;
}
}
if(B[2])F[++k]=2;
for(i=3;i<=1000000;i+=2)
{
if(B[i])F[++k]=i;
}
back(1,1,-1);
printf("%lld",SOL);
return 0;
}
void back(int poz,int val,int sg)
{
long long cnt;
int Val,u,w;
for(u=poz;u<=k;u++)
{
if(val*F[u]>1000000)break;
Val=val*F[poz];cnt=0;
for(cnt=0,w=Val;w<=1000000;w+=Val)if(BB[w])cnt++;
cnt=(cnt*(cnt-1))/2;SOL+=sg*cnt;
back(poz+1,Val,-sg);
}
}