Cod sursa(job #882860)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 19 februarie 2013 15:29:37
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#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);
    }
}