Cod sursa(job #1559610)

Utilizator hrazvanHarsan Razvan hrazvan Data 31 decembrie 2015 11:53:17
Problema Pairs Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.84 kb
#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; pr[j] * pr[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 -= 1LL * (-nr[i]) * (-nr[i] - 1) / 2;
    else
      rez += 1LL * 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;
}