Pagini recente » Cod sursa (job #1151050) | Cod sursa (job #2236830) | Cod sursa (job #1550705) | Cod sursa (job #1716146) | Cod sursa (job #918419)
Cod sursa(job #918419)
#include <fstream>
#define VM 1000010
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
int N, M;
int i, j;
int X;
int D[10];
int Frec[VM];
int Last[VM];
int ANS;
bool V[VM];
int Count ()
{
int i, N=1 << M, j;
int x;
int ANS=0;
int K;
for (i=1; i<N; i++)
{
x=1;
K=0;
for (j=0; (1 << j)<N; j++)
if ((i&(1 << j)))
x*=D[j+1], K++;
if (K%2)
ANS+=Frec[x];
else
ANS-=Frec[x];
}
return ANS;
}
void Update ()
{
int i, N=1 << M, j;
int x;
for (i=1; i<N; i++)
{
x=1;
for (j=0; (1 << j)<N; j++)
if ((i&(1 << j)))
x*=D[j+1];
Frec[x]++;
}
}
void CreateLast ()
{
int i, j;
for (i=2; i<VM; i++)
if (!V[i])
for (j=i; j<VM; j+=i)
{
V[j]=1;
Last[j]=i;
}
}
int main ()
{
CreateLast();
f >> N;
for (i=1; i<=N; i++)
{
f >> X;
M=0;
while (X>1)
{
if (Last[X]!=D[M])
D[++M]=Last[X];
X/=Last[X];
}
ANS+=i-1-Count();
Update();
}
g << ANS << '\n';
f.close();
g.close();
return 0;
}