Cod sursa(job #1200717)

Utilizator hrazvanHarsan Razvan hrazvan Data 23 iunie 2014 13:53:50
Problema Sum Scor 35
Compilator c Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#define MAXN 100000
#define NRPRIME 9592
#define DIV_MAX 6

int v[NRPRIME], dr = 0;

void ciur(int n){
  char bun[MAXN + 1];
  int i, j;
  for(i = 0; i <= n; i++)  bun[i] = 1;
  for(i = 2; i * i <= n; i++){
    if(bun[i]){
      for(j = i * i; j <= n; j += i){
        bun[j] = 0;
      }
    }
  }
  for(i = 2; i <= n; i++){
    if(bun[i]){
      v[dr] = i;
      dr++;
    }
  }
  return ;
}

int afl(int n, int *div, int *nr){
  *nr = 0;
  int i, rez = 1, lg;
  while(n > 0){
    i = n & (-n);
    n -= i;
    lg = 0;
    while(i > 1){
      lg++;
      i >>= 1;
    }
    rez *= div[lg];
    (*nr)++;
  }
  return rez;
}

int sum(int n){
  int i, div[DIV_MAX], d = 0;
  for(i = 0; i < dr; i++){
    if(n % v[i] == 0){
      div[d] = v[i];
      d++;
    }
  }
  int apar = 0, prod, nrap, adun;
  long long rez = (2 * n) * (2 * n + 1) / 2;
  for(i = 1; i < (1 << d); i++){
    apar++;
    prod = afl(apar, div, &nrap);
    adun = (2 * n) * (2 * n / prod + 1) / 2;
    if(nrap & 1)  adun = -adun;
    rez += adun;
  }
  return rez;
}

int main(){
  FILE *in = fopen("sum.in", "r");
  FILE *out = fopen("sum.out", "w");
  int n;
  fscanf(in, "%d", &n);
  ciur(MAXN);
  int i, x;
  for(i = 0; i < n; i++){
    fscanf(in, "%d", &x);
    fprintf(out, "%d\n", sum(x));
  }
  fclose(in);
  fclose(out);
  return 0;
}