Cod sursa(job #3218992)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 29 martie 2024 18:07:46
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>

using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n,ciur[1000001],nr,v[80000],fac[30],nrf,x,ind[1000001],numere;
struct numar
{
   int prod,semn,val;
}factori[1000001];
int main()
{
    fin>>n;
    ciur[0]=ciur[1]=1;
    for(int i=1;i<=1000000;i++)
    {
        if(ciur[i]==0)
        {
            nr++;
            v[nr]=i;

            for(int j=i+i;j<=1000000;j+=i)
            {
                ciur[j]=1;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        nrf=0;
        for(int d=1;v[d]*v[d]<=x;d++)
            {
                if(x%v[d]==0)
                {
                    nrf++;
                    fac[nrf]=v[d];
                    while(x%v[d]==0 && x!=1)
                    {
                        x=x/v[d];
                    }

                }
            }
            if(x!=1)
            {
                nrf++;
                fac[nrf]=x;
            }

            int l=(1<<nrf)-1;
            for(int p=1;p<=l;p++)
            {
                int nrcif=0;
                int prod=1;
                for(int j=0;j<nrf;j++)
                {
                    if((p>>j)&1)
                    {
                        nrcif++;
                        prod=prod*fac[j+1];
                    }
                }

                if(ind[prod]==0)
                {
                 numere++;
                 ind[prod]=numere;
                 int coef=1;
                 if(nrcif%2==0)
                    coef=-1;
                 factori[numere]={prod,coef,1};
                }
                else
                    factori[ind[prod]].val++;

            }
    }
    long long calc=1ll*n*(n-1)/2;

    long long val=0;

    for(int i=1;i<=numere;i++)
    {


        long long temp=1ll*factori[i].semn*(1ll*factori[i].val*(factori[i].val-1)/2);
        val=val+temp;
    }
    calc=calc-val;
    fout<<calc;


    return 0;
}