Pagini recente » Cod sursa (job #685290) | Cod sursa (job #922629) | Cod sursa (job #1483881) | Istoria paginii runda/oji20091112 | Cod sursa (job #630598)
Cod sursa(job #630598)
#include<stdio.h>
#include<fstream>
#include<math.h>
using namespace std;
#define MaxN 100100
#define MaxP 13
#define MaxM 1000100
int N,a,B[MaxN],C[MaxN][MaxP],SUM,A[MaxM],MAX,V[MaxP],M[MaxN],Prim[MaxM],PrimV[MaxM];
void Suma(int i,int l)
{
int prod = 1,nr = 0,nr2 = 0;
for(int j=1;j<=l;j++)
if(V[j])
prod *= C[i][j], ++ nr;
if(prod == 1) return ;
for(int j=1;j<=i;j++)
if(M[j] % prod == 0)
++ nr2;
if(nr % 2) SUM += nr2;
else SUM -= nr2;
}
void back(int i,int l,int k)
{
if(k == l+1)
Suma(i,l);
else
for(int j=0;j<=1;j++)
{
V[k] = j;
back(i,l,k+1);
}
}
void ciur(void)
{
for(int i=2;i<=1000000;i++)
if(PrimV[i] == 0)
{
Prim[++Prim[0]] = i;
for(int j=i+i;j<=1000000;j+=i)
PrimV[j] = 1;
}
}
int main()
{
ifstream f("pairs.in");
ofstream g("pairs.out");
f >> N;
ciur();
for(int i=1;i<=N;i++)
{
f >> a;
M[i] = a;
for(int j=1;Prim[j] <= a;j++)
if(a%Prim[j] == 0)
C[i][++C[i][0]] = Prim[j];
}
for(int i=1;i<=N;i++)
{
SUM = 0;
back(i,C[i][0],1);
MAX += i-SUM;
}
g << MAX;
return 0;
}