Cod sursa(job #930929)

Utilizator assa98Andrei Stanciu assa98 Data 27 martie 2013 21:37:04
Problema Pairs Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int MV=1000000;

char c[1000100];
int f[1000100];


void ciur()
{
    for(int i=1;i<=MV;i++)
        f[i]=i;
    for(int d=2;d*d<=MV;d+=2)
    {
        if(!c[d])
        {
            f[d]=d;
            for(int i=d+d;i<=MV;i+=d)
            {
                c[i]=1;
                f[i]=d;
            }
        }

        if(d==2)
            d--;
    }
}

vector <int> desc(int a)
{
    vector<int>V;
    while(a!=1)
    {
        V.push_back(f[a]);
        int fact=f[a];
        while(a%fact==0)
            a/=fact;
    }
    return V;
}

int v[1000100];

int pinex(int x,int c)
{
    vector<int>fact=desc(x);
    int n=fact.size();
    int sol=0;
    for(int i=1;i<(1<<n);i++)
    {
        int biti=0;
        int prod=1;
        for(int b=0;b<n;b++)
            if(i&(1<<b))
            {
                biti++;
                prod*=fact[b];
            }
        if(biti%2)
            sol+=v[prod];
        else
            sol-=v[prod];
        v[prod]++;
    }
    return c-sol-1;
}


int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    ciur();
    int n;
    scanf("%d",&n);
    int sol=0;
    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        sol+=pinex(a,i);
    }
    printf("%d",sol);
    return 0;
}