Cod sursa(job #1559604)

Utilizator hrazvanHarsan Razvan hrazvan Data 31 decembrie 2015 11:39:10
Problema Pairs Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.65 kb
#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;
}