Cod sursa(job #981527)

Utilizator stefanzzzStefan Popa stefanzzz Data 7 august 2013 14:08:37
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <vector>
#define MAXN 100005
#define sqrtMAXM 1050
#define MAXM 1000005
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");

int n,v[MAXN],x,nrmul[MAXM],nr,semn[MAXM];
long long sol;
vector<int> prime,div;
bool noprime[sqrtMAXM];

int main()
{
    int i,j,k;
    f>>n;
    for(i=1;i<=n;i++)
        f>>v[i];
    for(i=2;i<sqrtMAXM;i++){
        if(!noprime[i]){
            prime.push_back(i);
            for(j=2*i;j<sqrtMAXM;j+=i)
                noprime[j]=1;}}
    for(i=1;i<=n;i++){
        x=v[i];
        div.clear();
        for(j=0;prime[j]*prime[j]<=x;j++)
            if(!(x%prime[j])){
                div.push_back(prime[j]);
                while(!(x%prime[j]))
                    x/=prime[j];}
        if(x>1)
            div.push_back(x);
        for(j=0;j<(1<<(div.size()));j++){
            nr=1;
            for(k=0;k<div.size();k++)
                if(j&(1<<k))
                    nr*=div[k];
            nrmul[nr]++;
            if(!semn[nr]){
                x=1;
                for(k=0;k<div.size();k++)
                    if(j&(1<<k))
                        x=-x;
                semn[nr]=x;}}}
    for(i=1;i<MAXM;i++)
        sol+=1LL*nrmul[i]*(nrmul[i]-1)*semn[i]/2;
    g<<sol<<'\n';
    f.close();
    g.close();
    return 0;
}