Pagini recente » Borderou de evaluare (job #1330508) | Cod sursa (job #2656003) | Cod sursa (job #2954017) | Borderou de evaluare (job #1010231) | Cod sursa (job #2261405)
#include <fstream>
#define DIM 100005
#define DIMC 1000005
using namespace std;
ifstream in ("pairs.in");
ofstream out("pairs.out");
int maxim = -1;
int ciur[DIMC + 10];
int viz[DIMC + 10];
long long notPrime, n;
void CalcCiur(){
for(int i = 2; i * i <= DIMC; ++ i){
if(!ciur[i]){
ciur[i] = 1;
for(int j = i + i; j <= DIMC; j += i){
++ ciur[j];
}
}
}
for(int i = 2; i * i <= DIMC; ++ i){
for(int j = i * i; j <= DIMC; j += i * i)
ciur[j] = 0;
}
}
int main()
{
in>>n;
int x = 0;
for(int i = 1; i <= n; ++ i){
in>>x;
viz[x] = 1;
maxim = max(x, maxim);
}
CalcCiur();
long long Prime = n * (n - 1) / 2;
long long nr = 0;
for(int i = 2; i <= DIMC; ++ i){
if(ciur[i] > 0){
nr = 0;
for(int j = i; j <= DIMC; j += i)
nr += viz[j];
if(ciur[i] % 2){
Prime -= 1LL * nr * (nr - 1) / (1LL * 2LL);
}
else{
notPrime += 1LL * nr * (nr - 1) / (1LL * 2LL);
}
}
}
out<<Prime;
return 0;
}