Pagini recente » Cod sursa (job #2981265) | Cod sursa (job #475822) | Cod sursa (job #3265305) | Cod sursa (job #2927834) | Cod sursa (job #2312896)
#include<stdio.h>
int v[1000005], fr[1000005], ciur[1000005];
int main()
{
FILE *f = fopen("pairs.in", "r+");
FILE *g = fopen("pairs.out", "w+");
long long n, sol = 0, maxi = 0;
long long t = 0;
fscanf(f, "%lld", &n);
for(long long i = 1; i <= n; i++)
{
fscanf(f, "%d", &v[i]);
if(v[i] > maxi)
maxi = v[i];
ciur[v[i]] = 1;
}
for(long long i = 2; i < maxi; i++)
{
if(fr[i] == 0)
{
for(long long j = i; j <= maxi; j = j + i)
fr[j]++;
}
}
for(long long i = 2; i * i <= maxi; i++)
{
for(long long j = i * i; j <= maxi; j = j + i * i)
//frecventa fiecarui patrat al unui nr prim este initializata cu -1 pentru a putea fi exclus la parcurgere
fr[j] = -1;
}
for(long long i = 2; i <= maxi; i++)
{
if(fr[i] == -1)
continue;
//daca nu este patratul unui nr prim
long long nr = 0;
for(long long j = i; j <= maxi; j = j+ i)
//daca ma aflu pe un numar citit din fisier, cresc nr
{if(ciur[j] == 1)
nr++;}
t = nr * (nr - 1) / 2;
//daca frecventa este nr par, inseamna ca numarul pe acre ne aflam nu este prim, ci un multiplu al unui nr prim
if(fr[i] % 2 == 0)
//scad din solultatul final numarul de perechi numarate la pasul curent
sol = sol - t;
//altfel adaug la solultatul final numarul de perechi de la pasul curent
else sol = sol + t;
}
t = n * (n - 1) / 2;
//calculez nr de perechi viabile
// sol = t - sol;
fprintf(g, "%lld", t - sol);
return 0;
}