Cod sursa(job #1246699)

Utilizator mgntMarius B mgnt Data 21 octombrie 2014 15:58:58
Problema Sum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <vector>
#include <algorithm>
#include <cstdio>

::std::size_t  const maxn = 100000;

::std::size_t  X[maxn];

// Array f is It is zero initialized.
::std::size_t  f[maxn + 1];

bool
solveSum
()
{ freopen("sum.in", "r", stdin);
  freopen("sum.out", "w", stdout);
  ::std::size_t  n;
  scanf("%zd", &n);
  
  // Queries.
  ::std::size_t  i;
  ::std::size_t  x;
  ::std::size_t  m = 2;
  for(i=0; n>i; ++i)
  { scanf("%zd", &x);
    m = ::std::max(m, x);
    X[i] = x;
  }
  
  // Erastotene's Sieve.
  ::std::size_t  s;
  for(i=2; m >= i; ++i)
  { if(0 == f[i]  )
    { for(s = i; m >= s; s += i)
      { f[s] = i;
      }
    }
  }
  
  // Euler's Totient Function.
  ::std::size_t  p;
  ::std::size_t  a;
  ::std::size_t  b;
  for(i=2; m >= i; ++i)
  { p = f[i];
    a = 1;
    b = i;
    while(0 == (b % p)  )
    { a *= p;
      b /= p;
    }
    if( (1 == a) || (1 == b)  )
    { f[i] = i - (i/p);
    }
    else
    { f[i] = f[a] * f[b];
    }
  }
  
  // Answers.
  ::std::size_t  z;
  unsigned long long  w;
  for(i=0; n>i; ++i)
  { x = X[i];
    z = f[x];
    w  = x;
    w *= z;
    w *= 2;
    printf("%llu\n", w);
  }
  
  fcloseall();
  
  return true; // Success.
}

int
main
()
{ int  status;
  try
  { bool  const ok = solveSum();
    status = ( ok ? 0 : 1 );
  }
  catch ( ... )
  { status = 2;
  }
  return status;
}