Pagini recente » Istoria paginii utilizator/rqueen | Profil Roby2306 | Cod sursa (job #643458) | Rating Olareanu Alexandru (alexolareanu) | Cod sursa (job #359078)
Cod sursa(job #359078)
#include <fstream>
using namespace std;
#define MAX_N 100005
#define MAX_M 1000005
#define MAX_D 1005
ifstream fin ("pairs.in");
ofstream fout ("pairs.out");
int N, V[MAX_N], D[MAX_D], Nr[MAX_M], Sol;
void citire()
{
fin >> N;
for(int i = 1; i <= N; ++i)
fin >> V[i];
}
void solve()
{
for(int i = 1; i <= N; ++i)
{
if((V[i] & 1) == 0)
D[ D[0] = 1 ] = 2,
V[i] >>= 1;
else
D[0] = 0;
int x = V[i];
for(int k = 3; k*k <= V[i]; k+=2)
if((x % k) == 0)
{
D[ ++D[0] ] = k;
while(1)
{
if(x % k) break;
x /= k;
}
}
if(x > 1) D[ ++D[0] ] = x;
/*for(int k = 1; k <= D[0]; ++k)
printf("%d ",D[k]);
printf("\n");*/
int T = (1 << D[0]), nr = 0;
for(int k = 1; k < T; ++k)
{
int nrb = 0, p = 1;
for(int j = 0; j < D[0]; ++j)
if(k & (1 << j))
++nrb,
p*=D[j+1];
if(nrb & 1) nr += Nr[p];
else nr -= Nr[p];
++Nr[p];
}
Sol += (i-1-nr);
}
fout << Sol << "\n";
}
int main()
{
citire();
solve();
}