Cod sursa(job #3255453)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 10 noiembrie 2024 17:27:25
Problema Pairs Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");

const int valmax = 1000000;
int n;
long long sol;

int x[valmax + 5];
int dz[1005];

bool p[1010 + 5];

int b[16];
int nr[16];



void preprocess()
{
    p[0]=p[1]=true;
    for(int i = 2; i<=1000; i++)
        if(!p[i])
        {
            dz[++dz[0]]=i;
            for(int j = 2* i; j<=1000; j+=i)
                p[j]=true;
        }
}

void desc(int x)
{
    nr[0]=0;
    for(int i=1; dz[i]*dz[i]<=x; i++)
        if(x%dz[i]==0)
        {
            nr[++nr[0]]=dz[i];
            while(x%dz[i]==0)   x/=dz[i];
        }
    if(x!=1)
        nr[++nr[0]]=x;
}
void bk(int pas,int prod)
{
    if(pas!=1)
    {
        if(pas%2)
            sol+=x[prod];
        else
            sol-=x[prod];
        x[prod]++;
    }
    if(pas>nr[0])
        return;
    for(int i = b[pas-1] + 1; i<=nr[0]; i++)
    {
        b[pas]=i;
        bk(pas+1,prod*nr[b[pas]]);
    }

}

int main()
{
    preprocess();
    fin>>n;

    for(int i=1; i<=n; i++)
    {
        sol+=i-1;
        int x;
        fin>>x;
        desc(x);
        bk(1,1);
    }
    fout<<sol;
}