Cod sursa(job #1868442)

Utilizator TincaMateiTinca Matei TincaMatei Data 4 februarie 2017 22:19:40
Problema Sum Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>

int desc[200001];

int max(int a, int b) {
  if(a > b)
    return a;
  return b;
}

const int INF = 1000000000;
typedef long long i64;

int pr[5];

i64 sum(int x) {
  int prime = 1, last;
  last = desc[x];
  int xc = x;
  pr[0] = desc[x];
  while(xc > 1) {
    if(desc[xc] != last) {
      pr[prime] = desc[xc];
      prime++;
      last = desc[xc];
    }
    xc = xc / desc[xc];
  }

  i64 s = 0LL;
  for(int i = 1; i < 1 << prime; ++i) {
    int nr = 0, prod = 1;
    for(int j = 0; j < prime; ++j)
      if((1 << j) & i) {
        nr++;
        prod = prod * pr[j];
      }
    if(nr % 2 == 1)
      s = s + (i64)(2 * x / prod) * (2 * x / prod + 1) / 2 * prod;
    else
      s = s - (i64)(2 * x / prod) * (2 * x / prod + 1) / 2 * prod;
  }
  return (i64)2 * x * (2 * x + 1) / 2 - s;
}

int main() {
  int n, x;

  for(int d = 2; d * d <= 200000; ++d)
    if(desc[d] == 0)
      for(int i = d * d; i <= 200000; i = i + d)
        desc[i] = d;
  for(int d = 2; d <= 200000; ++d)
    if(desc[d] == 0)
      desc[d] = d;

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