Cod sursa(job #1559603)

Utilizator hrazvanHarsan Razvan hrazvan Data 31 decembrie 2015 11:35:01
Problema Pairs Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#define MAXNR 1000000
#define TIME 500000
#define MAXN 100000
#define NRPR 100000
int pr[NRPR], dr = 0, v[MAXN], nr[MAXNR + 1];
char s[MAXNR + 1], fr[MAXNR + 1];
long long rez = 0;

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();
  FILE *in = fopen("pairs.in", "r");
  int n, i;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++){
    fscanf(in, "%d", &v[i]);
    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;
}