Cod sursa(job #2559037)

Utilizator marinaoprOprea Marina marinaopr Data 26 februarie 2020 22:23:00
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 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;
          //  fprintf(fout,"%d ",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, "%lld", ans);



    fclose(fin);

    fclose(fout);

    return 0;

}