Cod sursa(job #885869)

Utilizator ELHoriaHoria Cretescu ELHoria Data 22 februarie 2013 14:21:21
Problema Pairs Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define FOR(i,a,b) for(int i = a;i <= b;i++)
#define i64 long long

using namespace std;

ifstream cin("pairs.in");
ofstream cout("pairs.out");

const int NMAX = int(1e6)+ 2;
int N;
vector<int> v;
char p[1024];
int primes[512], cardP;
int c[NMAX];


void sieve() {
    for(int i = 2;i < 1000;i++) {
        if(p[i] == 0) {
            primes[cardP++] = i;
            for(int j = i + i;j < 1000;j += i) {
                p[j] = 1;
            }
        }
    }
}

int gcd(int a,int b) { return !b ? a : gcd(b,a%b);}

void readData() {
    cin>>N;
    v.resize(N);
    FOR(i,0,N - 1) {
        cin>>v[i];
    }
}

i64 brute() {
    i64 ret = 0;
    sort(v.begin(),v.end());
    FOR(i,0,N - 1) {
        FOR(j,0,i - 1) {
            if(gcd(v[i],v[j]) == 1) {
                ret++;
           //     cout<<v[j]<<" "<<v[i]<<"\n";
            }
        }
    }
    return ret;
}

i64 solve() {
    i64 ret = 0;
    sieve();
    sort(v.begin(),v.end());
    int f[32], num;
    FOR(i,0,N - 1) {
        num = 0;
        int val = v[i];
        for(int k = 0;primes[k]*primes[k] <= val;k++) {
            if(val%primes[k] == 0) {
                f[num++] = primes[k];
                do {
                    val /= primes[k];
                } while(val%primes[k] == 0);

            }
        }
        if(val > 1) {
            f[num++] = val;
        }
        int notCoprime = 0;
    //    cout<<v[i]<<" : ";
        for(int j = 1;j < (1<<num);j++) {
            int currValue = 1, bitCnt = 0;
            for(int k = 0;k < num;k++) {
                if((j>>k) & 1) {
                    bitCnt++;
                    currValue = currValue*f[k];
                }
            }
            notCoprime += ((bitCnt & 1) ? 1 : -1) * c[currValue];
            c[currValue]++;
       //     cout<<currValue<<" ";
        }
       // cout<<"\n";cout<<notCoprime<<"\n";
       ret += i - notCoprime;
    }
    return ret;
}

int main()
{
    readData();
 //   cout<<brute()<<"\n";
    cout<<solve()<<"\n";
    return 0;
}