Cod sursa(job #460051)

Utilizator crawlerPuni Andrei Paul crawler Data 1 iunie 2010 01:49:54
Problema Sum Scor 85
Compilator c Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
#include <stdlib.h>

#define ll long long

int nr, a[100100][32], dim[100100];
ll lim, ret[100100];
char output_buffer[8192];
char  input_buffer[8192];

ll back(int lvl, ll prod) {
  if (lvl == dim[nr])
    return lim*(lim/prod+1);
  return back(lvl+1,prod) - back(lvl+1,prod*a[nr][lvl]);
}

int main() {
  freopen("sum.in", "r", stdin);
  freopen("sum.out", "w", stdout);

  setbuf(stdin ,  input_buffer);
  setbuf(stdout, output_buffer);

  int t,i,j;

  for (j = 2; j < 100100; j += 2)
    a[j][dim[j]++] = 2;

  for (i = 3; i < 100100; i+=2)
    if (dim[i] == 0) 
      for (j = i; j < 100100; j += i)
        a[j][dim[j]++] = i;

  scanf("%d\n", &t);


  while (t--) {
    char buff[32];
    fgets(buff, 32, stdin);
    nr = atoi(buff);
    if (ret[nr] == 0) {
      lim = nr << 1;
      ret[nr] = back(0,1)/2;
    }
    printf("%lld\n", ret[nr]);
  }
  
  return 0;
}