Pagini recente » Cod sursa (job #1125399) | Cod sursa (job #1573741) | Cod sursa (job #1280557) | wettbewerbssimulation1 | Cod sursa (job #2313394)
#include <fstream>
#include <vector>
#define M 1000000
#define P 7
using namespace std;
ifstream cin("pairs.in");
ofstream cout("pairs.out");
int ciur[M + 1];
vector<int> prime;
void fciur(){
for(int i = 2; i * i <= M; i++)
if (ciur[i] == 0)
for(int j = i * i; j <= M; j += i)
ciur[j] = 1;
for(int i = 2; i <= M; i++)
if (ciur[i] == 0){
prime.push_back(i);
}
// prime.push_back({1, 0});
// for(int i = 2; i <= M; i++)
// if (ciur[i] == 0){
// int n = prime.size();
// for(int j = 0; j < n && prime[j].first * i <= M; j++)
// prime.push_back({prime[j].first * i, prime[j].second ^ 1});
// }
}
int frecv[M + 1];
void desc(int x){
vector<int> desc;
for(int i = 0; i < prime.size() && prime[i] * prime[i] <= x; i++)
if (x % prime[i] == 0){
desc.push_back(prime[i]);
while(x % prime[i] == 0)
x /= prime[i];
}
if (x > 1) desc.push_back(x);
for(int i = 0; i < (1 << desc.size()); i++){
int p = 1;
int cnt = 0;
for(int j = 0; j < desc.size(); j++)
if (((1 << j) & i) != 0){
cnt++;
p *= desc[j];
}
frecv[p]++;
ciur[p] = cnt;
}
}
int main(){
fciur();
int n; cin >> n;
for(int i = 0; i < n; i++){
int x; cin >> x;
desc(x);
}
// cout << frecv[2] << endl;
long long ans = 0;
for(int i = 1; i <= M; i++)
if (frecv[i] > 0){
// cout << ans << endl;
if ((ciur[i] & 1) == 0) ans += 1LL * frecv[i] * (frecv[i] - 1) / 2;
else ans -= 1LL * frecv[i] * (frecv[i] - 1) / 2;
}
cout << ans << endl;
return 0;
}