Cod sursa(job #881558)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 18 februarie 2013 11:30:25
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
#define N 1000000

using namespace std;

bool ok[N+1],prim[N+1],v[N+1];
int nrdiv[N+1];

void ciur()
{
    int i,j;
    for(i=1;i<=N;++i)
        ok[i]=prim[i]=true;
    prim[1]=ok[1]=false;
    for(i=1;i<=N;++i)
    {
        if(!prim[i])
            continue;
        nrdiv[i]=1;
        for(j=2;i*j<=N;++j)
        {
            prim[i*j]=false;
            nrdiv[i*j]++;
            if(j%i==0)
            {
                ok[i*j]=false;
            }
        }
    }
}

int main()
{
    ifstream in("pairs.in");
    ofstream out("pairs.out");
    int n,p,i,j,k;
    long long rez;
    in>>n;
    for(i=1;i<=n;++i)
    {
        in>>p;
        v[p]=true;
    }
    ciur();
    rez=(long long)n*(n-1)/2;
    for(i=2;i<=N;++i)
    {
        if(!ok[i])
            continue;
        k=0;
        for(j=1;j*i<=N;++j)
            if(v[i*j]==true)
                ++k;
        if(nrdiv[i]%2==0)
            rez+=(long long)k*(k-1)/2;
        else
            rez-=(long long)k*(k-1)/2;
    }
    out<<rez<<"\n";
    return 0;
}