Pagini recente » Cod sursa (job #2299252) | Cod sursa (job #752514) | Cod sursa (job #1687122) | Cod sursa (job #707901) | Cod sursa (job #1559607)
#include <stdio.h>
#define MAXNR 1000000
#define SQRT 1000
#define MAXN 100000
#define NRPR 100000
#define BUFF (1 << 20)
#define MAXDES 20
int pr[NRPR], dr = 0, fact[MAXDES], nr[MAXNR + 1];
char s[MAXNR + 1];
FILE *in;
char ssin[BUFF];
int pin = BUFF;
inline char cif(char ch){
if(ch >= '0' && ch <= '9')
return 1;
return 0;
}
inline char getcharr(){
if(pin == BUFF){
fread(ssin, 1, BUFF, in);
pin = 0;
}
pin++;
return ssin[pin - 1];
}
inline long long getnumm(){
char ch = getcharr();
long long rez = 0;
while(!cif(ch))
ch = getcharr();
while(cif(ch)){
rez *= 10;
rez += ch - '0';
ch = getcharr();
}
return rez;
}
inline void ciur(){
long long i, j;
for(i = 2; i <= SQRT; i++){
if(!s[i]){
pr[dr] = i;
dr++;
for(j = i * i; j <= SQRT; j += i)
s[j] = 1;
}
}
pr[dr] = SQRT + 1;
dr++;
}
int main(){
ciur();
in = fopen("pairs.in", "r");
int n, i, j, x, d, k, add;
n = getnumm();
for(i = 0; i < n; i++){
x = getnumm();
d = 0;
for(j = 0; j * j <= x; j++){
if(x % pr[j] == 0){
fact[d] = pr[j];
d++;
while(x % pr[j] == 0)
x /= pr[j];
}
}
if(x > 1){
fact[d] = x;
d++;
}
for(j = 0; j < (1 << d); j++){
x = 1;
add = -1;
for(k = 0; k < d; k++){
if(j & (1 << k)){
add = -add;
x *= fact[k];
}
}
nr[x] += add;
}
}
fclose(in);
long long rez = 0;
for(i = 2; i <= MAXNR; i++){
if(nr[i] < 0)
rez -= (-nr[i]) * (-nr[i] - 1) / 2;
else
rez += nr[i] * (nr[i] - 1) / 2;
}
FILE *out = fopen("pairs.out", "w");
fprintf(out, "%lld", 1LL * n * (n - 1) / 2 - rez);
fclose(out);
return 0;
}