Cod sursa(job #918758)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 19 martie 2013 09:26:48
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <vector>
#define pb push_back
#define N 1000000
using namespace std;
bool neprim[N+2];
vector<int>divs;
int card, n, last, i, x, m, half, conf, prod, j, p, nr[N+2], primes[N+2], gd[N+2];
long long rez;
void descompune(int x)
{
if(x == 1) return;
if(gd[x] != last) divs.pb(gd[x]);
last = gd[x];
descompune(x/gd[x]);
}
void ciur()
{
int i, j;
for(i = 2; i <= N; i++)
if(!neprim[i])
{
primes[++p] = i;
gd[i] = i;
for(j = 2*i; j <= N; j += i)
{
neprim[j] = 1;
gd[j] = i;
}
}
}
int main()
{
ifstream fi("pairs.in");
ofstream fo("pairs.out");
fi >> n;
ciur();
for(i = 1; i <= n; i++)
{
fi >> x;
divs.clear();
last = 0;
descompune(x);
m = divs.size();
rez += i-1;
for(conf = 1; conf < (1<<m); ++conf)
{
prod = 1;
for(j = 0, card = 0; j < m; j++)
if(((1<<j) & conf) > 0)
{
prod *= divs[j];
card++;
}
if(card % 2) rez -= 1LL*nr[prod]; else rez += 1LL*nr[prod];
nr[prod]++;
}
}
fo << rez << "\n";
return 0;
}