Pagini recente » Cod sursa (job #1420181) | Cod sursa (job #2293182) | Cod sursa (job #2179659) | Cod sursa (job #1575684) | Cod sursa (job #2305145)
#include <fstream>
#define MILLION 1000000
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
int N, x, v[11], l, prime[201], nrPrime, i, j;
int divisibleWith[MILLION + 1];
long long res, nr;
void find_primes() {
bool sieve[1001] = {false};
for (int i = 2; i * i < 1000; ++i) {
if (sieve[i] == 1) continue;
for (int j = i * i; j <= 1000; j += i)
sieve[j] = 1;
}
for (int i = 2; i < 1000; ++i)
if (sieve[i] == 0)
prime[++nrPrime] = i;
}
void prime_decomposition(int x, int v[], int &l) {
l = 0;
for (int i = 1; prime[i] * prime[i] <= x && i <= nrPrime; ++i) {
if (x % prime[i] == 0) {
v[++l] = prime[i];
while (x % prime[i] == 0)
x /= prime[i];
}
}
if (x != 1) v[++l] = x;
}
long long pinex(int v[], int l) {
long long sol = 0;
int Max = 1 << l;
for (int i = 1; i < Max; ++i) {
int sign = -1, prod = 1;
for (int j = 0; j < l; ++j)
if (i & (1 << j) ) {
prod *= v[j + 1];
sign *= -1;
}
sol += sign * divisibleWith[prod];
divisibleWith[prod]++;
}
return sol;
}
int main() {
f >> N;
nrPrime = 0;
find_primes();
for (i = 1; i <= N; ++i) {
f >> x;
prime_decomposition(x, v, l);
nr = pinex (v, l);
res = res + (i - 1) - nr;
}
g << res;
return 0;
}