Pagini recente » Cod sursa (job #1683336) | Cod sursa (job #299945) | Cod sursa (job #2470032) | Cod sursa (job #1760545) | Cod sursa (job #3173487)
#include <bits/stdc++.h>
#define NMAX 1000000
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
bitset <NMAX + 5> c;
int fp[NMAX + 5];
int mp[NMAX + 5];
void ciur(){
c[2] = 1;
for(int i = 2; i <= NMAX; i += 2){
c[i] = 1;
fp[i] = 2;
}
for(int i = 3; i * 2 <= NMAX; i++){
if(!c[i]){
for(int j = i; j <= NMAX; j += i){
fp[j] = i;
c[j] = 1;
}
}
}
}
int nrdp(int n){
int s = 0;
while(n > 1){
int k = 0,f = fp[n];
while(n % f == 0){
n /= f;
k++;
}
if(k > 1) return 0;
s++;
}
return s;
}
int main()
{
int n,i,d,x;
ciur();
fin >> n;
for(i = 1; i <= n; i++){
fin >> x;
for(d = 2; d * d < x; d++){
if(x % d == 0){
if(nrdp(d))
mp[d]++;
if(nrdp(x / d))
mp[x / d]++;
}
}
if(d * d == x && nrdp(d)) mp[d]++;
if(nrdp(x)) mp[x]++;
}
long long rez = 1LL * n * (n - 1) / 2;
for(i = 2; i <= NMAX; i++){
if(!mp[i]) continue;
if(nrdp(i) % 2 == 1) rez -= 1LL * mp[i] * (mp[i] - 1) / 2;
else rez += 1LL * mp[i] * (mp[i] - 1) / 2;
}
fout << rez;
return 0;
}