Pagini recente » Cod sursa (job #1110217) | Cod sursa (job #1367589) | Arhiva de probleme | Cod sursa (job #1528784) | Cod sursa (job #3173476)
#include <bits/stdc++.h>
#define NMAX 1000000
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
bitset <NMAX + 5> c;
struct prim{
vector <int> fp;
};
prim v[NMAX + 5];
map <int, int> mp;
void ciur(){
c[2] = 1;
for(int i = 2; i <= NMAX; i += 2){
c[i] = 1;
v[i].fp.push_back(2);
}
for(int i = 3; i * 2 <= NMAX; i++){
if(!c[i]){
for(int j = i; j <= NMAX; j += i){
v[j].fp.push_back(i);
c[j] = 1;
}
}
}
}
int nrdp(int n){
int s = v[n].fp.size();
for(auto x : v[n].fp){
int p = 0;
while(n % x == 0){
n /= x;
p++;
}
if(p > 1) return 0;
}
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;
map <int, int> :: iterator it;
for(it = mp.begin(); it != mp.end(); it++){
if(nrdp(it->first) % 2 == 1) rez -= it->second * (it->second - 1) / 2;
else rez += it->second * (it->second - 1) / 2;
}
fout << rez;
return 0;
}