Cod sursa(job #3255449)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 10 noiembrie 2024 17:23:03
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb


#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");

const int valmax = 1000000;
long long n;

long long sol;
long long mx;

bool f[valmax + 5];
long long x[valmax + 5];
long long dz[1005];

bool p[1010 + 5];

long long b[16];
long long nr[16];

void bk(int pas,long long 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[i]]);
    }

}

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;
}

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;
}