Cod sursa(job #918277)

Utilizator dariusdariusMarian Darius dariusdarius Data 18 martie 2013 19:01:31
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> primes,p;
int d[1000005],f[1000005],a[100005];
void build_primes()
{
    d[1]=1;
    for(int i=2;i<=1000000;i++)
        if(!d[i])
        {
            primes.push_back(i);
            for(int j=i;j<=1000000;j+=i) d[j]=i;
        }
}
void build(int x,int last)
{
    if(x==1) return;
    if(last!=d[x])
        p.push_back(d[x]);
    build(x/d[x],d[x]);
}
void biti(int &x,int &semn,int config)
{
    semn=1;x=1;
    for(int b=0;b<(int)p.size();b++)
        if(config&(1<<b))
        {
            semn=-semn;
            x*=p[b];
        }
}
int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    int n,i,j,aux,ans,semn;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    build_primes();
    for(i=1;i<=n;i++)
    {
        p.clear();
        build(a[i],-1);
        for(j=1;j<(1<<p.size());j++)
            biti(aux,semn,j),f[aux]++;
    }
    long long rez=0;
    for(i=1;i<=n;i++)
    {
        p.clear();
        build(a[i],-1);
        ans=n;
        for(j=1;j<(1<<p.size());j++)
            biti(aux,semn,j),ans+=semn*f[aux];
        rez=rez+ans;
    }
    printf("%lld\n",rez/2);
    return 0;
}