Pagini recente » Cod sursa (job #2398168) | Cod sursa (job #674044) | Cod sursa (job #2028553) | Cod sursa (job #1735432) | Cod sursa (job #1559604)
#include <stdio.h>
#define MAXNR 1000000
#define TIME 500000
#define MAXN 100000
#define NRPR 100000
#define BUFF (1 << 20)
int pr[NRPR], dr = 0, v[MAXN], nr[MAXNR + 1];
char s[MAXNR + 1], fr[MAXNR + 1];
long long rez = 0;
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 calc(){
int i, j;
for(i = 2; i <= TIME; i++)
for(j = i; j <= MAXNR; j += i)
nr[i] += fr[j];
}
inline void ciur(){
long long i, j;
for(i = 2; i <= TIME; i++){
if(!s[i]){
pr[dr] = i;
dr++;
for(j = i * i; j <= TIME; j += i)
s[j] = 1;
}
}
}
void bkt(int ad, int p, int k){
if(ad & 1)
rez += 1LL * nr[k] * (nr[k] - 1) / 2;
else
rez -= 1LL * nr[k] * (nr[k] - 1) / 2;
int i;
for(i = p; i < dr; i++){
if(1LL * k * pr[i] >= TIME)
i = dr;
else if(nr[k * pr[i]] > 1)
bkt(ad + 1, i + 1, k * pr[i]);
}
}
int main(){
ciur();
in = fopen("pairs.in", "r");
int n, i;
n = getnumm();
for(i = 0; i < n; i++){
v[i] = getnumm();
fr[v[i]]++;
}
fclose(in);
calc();
bkt(0, 0, 1);
FILE *out = fopen("pairs.out", "w");
fprintf(out, "%lld", 1LL * n * (n - 1) / 2 - rez);
fclose(out);
return 0;
}