Cod sursa(job #460047)

Utilizator crawlerPuni Andrei Paul crawler Data 1 iunie 2010 01:41:11
Problema Sum Scor 75
Compilator c Status done
Runda Arhiva de probleme Marime 0.67 kb
#include <stdio.h>

#define ll long long

int nr, a[100100][32], dim[100100];
ll lim, ret[100100];

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

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

  int t,i,j;
  
  scanf("%d", &t);
  
  for (i = 2; i < 100100; ++i) {
    if (dim[i] == 0) {
      for (j = i; j < 100100; j += i)
        a[j][dim[j]++] = i;
    }
    lim = i << 1;
    nr = i;
    ret[i] = back(0,1);
  }

  while (t--) {
    scanf("%d", &nr);
    printf("%lld\n", ret[nr]);
  }
  
  return 0;
}