Cod sursa(job #2558904)

Utilizator marinaoprOprea Marina marinaopr Data 26 februarie 2020 21:12:32
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <vector>

using namespace std;

FILE *fin = fopen("pairs.in", "r");
FILE *fout = fopen("pairs.out", "w");

vector <int> a[100005];

int n,i,x,d,nrfact[100005],prod,fr[1000005],val,j,k,nr,prime[100000],valmax,nrprime;
long long ans;
bool ciur[1000005];

int main()
{
    valmax = 1000000;
    for(i=2; i<=valmax; ++i)
        if(!ciur[i])
        {
            prime[++nrprime] = i;
            for(j=i+i; j<=valmax; j+=i)
                ciur[j] = 1;
        }

    fscanf(fin, "%d", &n);
    for(i=1; i<=n; ++i)
    {
        fscanf(fin, "%d", &x);

        j = 1;
        while(prime[j]*prime[j] <= x)
        {
            if(x%prime[j] == 0)
            {
                nrfact[i]++;
                a[i].push_back(prime[j]);
                while(x%prime[j] == 0)
                    x /= prime[j];
            }
            ++j;
        }

        if(x > 1)
        {
            nrfact[i]++;
            a[i].push_back(x);
        }
    }

    for(i=1; i<=n; ++i)
    {
        val = 1<<(nrfact[i]) - 1;

        for(j=1; j<=val; ++j)
        {
            prod = 1;
            nr = 0;
            for(k=0; k<=nrfact[i]; ++k)
                if(j & (1<<k))
                {
                    prod *= a[i][k];
                    ++nr;
                }
            fr[prod]++;
            if(nr%2)
                ans += 1LL*(fr[prod]-1LL);
            else
                ans -= 1LL*(fr[prod]-1LL);
        }//for j
    }

    ans = 1LL*n*(n-1)/2LL - ans;
    fprintf(fout, "%d", ans);

    fclose(fin);
    fclose(fout);
    return 0;
}