Cod sursa(job #3219103)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 30 martie 2024 00:48:40
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin ("pairs.in");
ofstream fout("pairs.out");
long long t,F[1000002],n,x,sol,k,P,A,B;
long long v[20],D[20];
vector <long long> prime;
void precalc()
{
    F[0]=2;
    F[1]=2;
    for(int i=2;i<=1000;i++)
    {
        if(!F[i])
        {
            F[i]=1;
            prime.push_back(i);
            for(int j=i+i;j<=1000;j+=i)
                F[j]=2;
        }
    }
}
void backtrack(int pas,int ant)
{
    if(ant+1<=k)
    {
        for(int i=ant+1;i<=k;i++)
        {
            v[pas]=D[i];
            P*=D[i];
            backtrack(pas+1,i);
            if(pas%2)
                sol+=F[P];
            else
                sol-=F[P];
            F[P]++;
            P/=D[i];
        }
    }
}
void solve(int nr)
{
    int ind=0;
    k=0;
    while(nr!=1&&ind<prime.size())
    {
        if(nr%prime[ind]==0)
        {
            D[++k]=prime[ind];
            while(nr%prime[ind]==0)
                nr/=prime[ind];
        }
        ind++;
    }
    if(nr>1&&ind==prime.size())
        D[++k]=nr;
    P=1;
    backtrack(1,0);
    //fout<<sol<<"\n";
}
int main()
{
    precalc();
    memset(F,0,sizeof(F));
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        solve(x);
    }
    fout<<n*(n-1)/2-sol;
    return 0;
}