Pagini recente » Cod sursa (job #2003426) | Cod sursa (job #2063682) | Cod sursa (job #439850) | Cod sursa (job #485838) | Cod sursa (job #3305930)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5+2;
const int VMAX = 1e6+2;
int n,v[NMAX],cnt[VMAX],mobius[VMAX];
bool ciur[VMAX];
vector<int> freeSquares;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int main(){
for(int i = 1; i < VMAX; i++){
mobius[i] = 1;
}
for(int i = 2; i < VMAX; i++){
if(ciur[i] == 0){
mobius[i] = -1;
for(int j = 2*i; j < VMAX; j += i){
ciur[j] = 1;
}
for(long long j = 1ll*i*i; j < VMAX; j += 1ll*i*i){
mobius[j] = 0;
}
}
for(int j = 2*i; j < VMAX; j += i){
mobius[j] *= mobius[i];
}
if(mobius[i] != 0){
freeSquares.push_back(i);
}
}
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
cnt[v[i]]++;
}
for(int i = 1; i < VMAX; i++){
for(int j = 2*i; j < VMAX; j += i){
cnt[i] += cnt[j];
}
}
long long ans = 1ll*n*(n-1)/2;
for(int num: freeSquares){
ans += mobius[num]*(1ll*cnt[num]*(cnt[num]-1)/2);
}
fout << ans;
return 0;
}