Cod sursa(job #460044)

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

#define Nmax 1024
#define ll long long

int n, a[32], dim, lim, ret;

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

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

  int t;
  
  scanf("%d", &t);
  
  a[0] = 1;
  while (t--) {
    scanf("%d", &n);
    lim = n << 1;
    dim = -1;

    int i;
    for (i = 2; i*i <= n; ++i)
      if (n % i == 0) {
        a[++dim] = i;
        while (n % i == 0)
          n /= i;
      }

    if (n > 1)
      a[++dim] = n;

    printf("%lld\n", back(0,1));
  }
  
  return 0;
}