Pagini recente » Cod sursa (job #1064539) | Cod sursa (job #3159075) | Cod sursa (job #1587604) | Cod sursa (job #2026887) | Cod sursa (job #630612)
Cod sursa(job #630612)
#include<stdio.h>
#include<fstream>
#include<math.h>
using namespace std;
#define MaxN 100100
#define MaxP 13
#define MaxM 1000100
#define ll long long
int N,a,C[MaxN][MaxP],SUM,A[MaxM],MAX,V[MaxP],Prim[MaxM],PrimV[MaxM],B[MaxM],M[MaxN],sol;
void back0(int k,int i,int p)
{
if(k == C[i][0]+1)
{
if(p <= MaxM)
B[p] ++;
return ;
}
back0(k+1,i,p);
back0(k+1,i,1LL*p*C[i][k]);
}
void back(int k,int i,int p,int nr)
{
if(k == C[i][0]+1)
{
if(p <= MaxM && p > 1)
if(nr&1)
sol += B[p]-1;
else
sol -= B[p]-1;
return ;
}
back(k+1,i,p,nr);
back(k+1,i,1LL*p*C[i][k],nr+1);
}
void ciur(void)
{
for(int i=2;i<=1000100;i++)
if(PrimV[i] == 0)
{
Prim[++Prim[0]] = i;
for(int j=i+i;j<=1000000;j+=i)
PrimV[j] = 1;
}
}
void memsetB(void)
{
for(int i=1;i<=1000000;i++)
B[i] ++;
}
int main()
{
ifstream f("pairs.in");
ofstream g("pairs.out");
f >> N;
ciur();
memsetB();
for(int i=1;i<=N;i++)
{
f >> a;
int x = sqrt((double)a);
M[i] = a;
for(int j=1;Prim[j] <= x && a != 1;j++)
if(a%Prim[j] == 0)
{
C[i][++C[i][0]] = Prim[j];
while(a%Prim[j] == 0)
a /= Prim[j];
}
if(a != 1)
C[i][++C[i][0]] = a;
back0(1,i,1);
}
for(int i=1;i<=N;i++)
if(M[i] == 1)
MAX -= N-1;
else
{
sol = 0;
back(1,i,1,0);
MAX += N-sol;
}
g << MAX/2;
return 0;
}