Cod sursa(job #265249)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 23 februarie 2009 17:40:43
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>
#include <math.h>

#define maxn 10010
#define maxnr 1000010

using namespace std;

long n, i, j, k, m, l, ndp, r, nr, nrb, pr, sum, sol, d;
long long sol;
long v[maxnr], dp[maxnr], f[maxnr];

int main()
{
    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);
    scanf("%d\n", &n);
    sol=0;
    for(i=1; i<=n; i++)
    {
        sum=0;
        scanf("%d", &v[i]);
        
        d=1;
        nr=0;
        r = (long)sqrt(v[i]);
     //   printf("*\n");
        
        while(v[i]>1 && d<=r)
        {
            d++;
            if(v[i] % d==0)
            {
                nr++;
                dp[nr]=d;
                while(v[i] % d == 0)
                {
                    v[i]/=d;
                }
           //     printf("*");
            }
         //   printf("%d ", d);
        }
     //   printf("\n");
        if(v[i]>1)
        {
            nr++;
            dp[nr]=v[i];
        }
     /*   for(j=1; j<=nr; j++)
        {
            printf("%d ", dp[j]);
        }
        printf("\n");*/
        for(j=1; j<(1<<nr); j++)
        {
            nrb=0;
            pr=1;
            for(l=0; l<nr; l++)
            {
                if( (1<<l) & j)
                {
                    nrb++;
                    pr*=dp[l+1];
                }
            }
            if(nrb%2==0)
            {
                sum-=f[pr];
            }
            else
            {
                sum+=f[pr];
            }
            f[pr]++;
        }
        sol+=i-sum-1;                    
    }
    printf("%d\n", sol);
    return 0;
}