Pagini recente » Cod sursa (job #380726) | Cod sursa (job #2582259) | Cod sursa (job #2424466) | Cod sursa (job #1888631) | Cod sursa (job #918396)
Cod sursa(job #918396)
#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[8][VM];
int Frec[VM];
int ANS;
bool V[VM];
int Count (int X)
{
int i, N=1 << D[0][X], 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][X], K++;
if (K%2)
ANS+=Frec[x];
else
ANS-=Frec[x];
}
return ANS;
}
void Update (int X)
{
int i, N=1 << D[0][X], 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][X];
Frec[x]++;
}
}
void CreateD ()
{
int i, j;
for (i=2; i<VM; i++)
if (!V[i])
for (j=i; j<VM; j+=i)
{
D[0][j]++;
D[D[0][j]][j]=i;
V[j]=1;
}
}
int main ()
{
CreateD();
f >> N;
for (i=1; i<=N; i++)
{
f >> X;
ANS+=i-1-Count(X);
Update(X);
}
g << ANS << '\n';
f.close();
g.close();
return 0;
}