Mai intai trebuie sa te autentifici.
Cod sursa(job #628131)
Utilizator | Data | 31 octombrie 2011 17:55:52 | |
---|---|---|---|
Problema | Pairs | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.31 kb |
#include<fstream>
#include<vector>
#define maxn 100005
#define maxval 1000005
#define pb push_back
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
int n,i,j,maxv,m,k,conf,nr1; long long nrp,r;
int A[maxn],Ind[maxval],nrd[maxval];
bool ciur[maxval];
vector<int>P[maxn];
int main () {
f >> n;
for ( i = 1 ; i <= n ; ++i ){
f >> A[i]; Ind[A[i]] = i;
maxv = maxv < A[i] ? A[i] : maxv;
}
for ( i = 2 ; i <= maxv ; ++i ){
if ( !ciur[i] ){
if ( Ind[i] ) P[Ind[i]].pb(i);
for ( j = i + i ; j <= maxv ; j += i ){
ciur[j] = 1;
if ( Ind[j] ) P[Ind[j]].pb(i);
}
}
}
for ( i = 1 ; i <= n ; ++i ){
m = P[i].size();
for ( j = 1 ; j < (1<<m) ; ++j ){
conf = j; r = 1;
for ( k = 0 ; k < m ; ++k ){
if ( conf & 1 ){
r = r * P[i][k];
}
conf = conf >> 1;
}
++nrd[r];
}
}
for ( i = 1 ; i <= n ; ++i ){
m = P[i].size();
for ( j = 1 ; j < (1<<m) ; ++j ){
conf = j; r = 1; nr1 = 0;
for ( k = 0 ; k < m ; ++k ){
if ( conf & 1 ){
r = r * P[i][k]; ++nr1;
}
conf = conf >> 1;
}
r = nrd[r] - 1;
if ( nr1 & 1 ){
nrp += r;
}
else{
nrp -= r;
}
}
}
nrp = 1LL*n*(n-1)/2 - nrp/2;
g << nrp << "\n";
f.close();
g.close();
return 0;
}