Mai intai trebuie sa te autentifici.
Cod sursa(job #214224)
Utilizator | Data | 13 octombrie 2008 15:29:49 | |
---|---|---|---|
Problema | Pairs | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.21 kb |
#include<stdio.h>
#define lg 1000002
int i, x, mxx, k, j, d[lg], q[100002], ind;
bool este[lg], prim[lg];
long long n, rsp;
inline int max(int a, int b){
return a > b ? a : b;
}
int main()
{
freopen("pairs.in", "rt", stdin);
freopen("pairs.out", "wt", stdout);
scanf("%lld", &n);
for (i = 1; i <= n; i ++){
scanf("%d", &x);
mxx = max(mxx, x); este[x] = 1;
}
for (i = 2; i*i <= mxx; i ++)
if (!prim[i])
for (k = 2; k*i <= mxx; k ++)
prim[k*i] = 1;
for (i = 2; i <= mxx; i ++)
if (!prim[i])
q[++ind] = i;
for (i = 1; i <= mxx; i ++){
for (k = 1; i*k <= mxx; k ++)
if (este[i*k] == 1)
d[i] ++;
// rsp += d[i] * (d[i] - 1);
}
/*
for (i = 2; i <= mxx; i ++)
printf("numarul cu %d %d\n", i, d[i]);
printf("%d\n", rsp);
*/
for (i = 2; i <= mxx; i ++){
d[i] = (d[i] * (d[i] + 1)) / 2;
int s = 0, nrs = 0;
for (j = 1; q[j] <= i && j <= ind; j ++)
if (i % q[j] == 0)
if ((i / q[j]) % q[j] != 0)
nrs ++;
else
s = 1;
//printf("pentru %d %d %d\n", i, nrs, s);
if (!s)
if (nrs % 2 == 0){
rsp -= d[i];
//printf("scad %d\n", i);
}
else{
rsp += d[i];
//printf("adaug %d\n", i);
}
}
printf("%lld\n", (n*(n+1)) / 2 - rsp);
return 0;
}