Pagini recente » Cod sursa (job #3313522) | Cod sursa (job #544271) | Cod sursa (job #458444) | Cod sursa (job #3339753) | Cod sursa (job #3305873)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5+2;
const int VMAX = 1e6+2;
const int PMAX = 1e3+2;
int n,v[NMAX],cnt[VMAX],vf[VMAX];
bool ciur[PMAX];
vector<int> primes;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
vector<int> factorise(int x){
vector<int> ans;
int idx = 0;
while(x > 1 && primes[idx]*primes[idx] <= x && idx < (int)primes.size()){
int exp = 0;
while(x%primes[idx] == 0){
exp++;
x /= primes[idx];
}
if(exp > 0){
ans.push_back(primes[idx]);
}
idx++;
}
if(x > 1){
ans.push_back(x);
}
return ans;
}
int main(){
for(int i = 2; i < PMAX; i++){
if(ciur[i] == 0){
primes.push_back(i);
for(int j = 2*i; j < PMAX; j += i){
ciur[j] = 1;
}
}
}
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
cnt[v[i]]++;
}
for(int i = 2; i < VMAX; i++){
for(int j = 2*i; j < VMAX; j += i){
cnt[i] += cnt[j];
}
}
long long ans = 0;
for(int i = 1; i <= n; i++){
vector<int> fact = factorise(v[i]);
int contrib = n-1, nrf = fact.size();
for(int mask = 0; mask < (1<<nrf); mask++){
int prod = 1;
for(int j = 0; j < nrf; j++){
int bt = (mask>>j)&1;
prod *= (bt ? fact[j] : 1);
}
int coef = (__builtin_popcount(mask)%2 ? -1 : 1);
contrib += coef * (cnt[prod] - 1);
}
ans += contrib;
}
fout << ans;
return 0;
}