Cod sursa(job #1972761)

Utilizator GoogalAbabei Daniel Googal Data 23 aprilie 2017 17:01:39
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <fstream>

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

const int MOD = 9973;
const int NMAX = 1000005;

long long t, n, r1, r2, prim[NMAX], k;
bool ciur[NMAX];

void ciur_er()
{
  long long i,j;
  for(i=2; i<NMAX; i++)
  {
    if(!ciur[i])
    {
      prim[++k]=i;
      for(j=i+i; j<=NMAX; j+=i)
      ciur[j]=true;
      }
  }
}

void inv_mod(long long &x, long long &y, long long a, long long b){
  if(!b){
    x=1;
    y=0;
  } else{
    inv_mod(x, y, b, a%b);
    swap(x, y);
    y -= x * (a/b);
  }
}

long long turn_to_inv(long long x){
  long long inv = 0, ins;
  inv_mod(inv, ins, x, MOD);
  inv %= MOD;
  if(inv <= 0)
    inv = MOD + inv % MOD;
  return ((long long) inv);
}

long long effpower(long long x, long long y) {
  if(x == 0)
    return 0;
  else if(y == 0)
    return 1;
  else{
    long long result = effpower(x, (y >> 1));
    if((y & 1) == 0)
      return (result * result) % MOD;
    else
      return (((result * result) % MOD) * x) % MOD;
  }
}
// nr div: (d1 + 1)*(d2 + 1)*...*(dk+1)
// sdiv :   p^(e+1)-1 /(p -1)

void decompose(long long a){
  long long exp = 0;
  if(a%2 == 0) {
    while(a%2 == 0) {
      a /= 2;
      exp++;
    }
    r1 *= (exp + 1);
    long long factor = effpower(2, exp + 1) - 1;
    if(factor < 0)
      factor = MOD + factor % MOD;

    r2 = (r2 * factor) % MOD;
  }

  long long j = 2;
  while(prim[j] * prim[j]<= a){
    exp = 0;
    long long i = prim[j];
    while(a%i == 0){
      a /= i;
      exp++;
    }
    if(0 < exp) {
      r1 *= (exp + 1);
      if((i-1) % MOD == 0) {
        r2 = (r2 * (exp+1)) % MOD;
      } else {
        long long factor = effpower(i % MOD, exp + 1) - 1;
        if(factor < 0)
            factor = MOD + factor % MOD;

         r2 = (r2 * factor) % MOD;
        r2 = (r2 * turn_to_inv(i - 1)) % MOD;
      }
    }
    j++;
  }

  if(1 < a) {
    r1 *= 2;
    if((a - 1) % MOD == 0){
    r2 = (r2 * (2)) % MOD;
    } else{
      long long factor = effpower(a, 2) - 1;
      if(factor < 0)
      factor = MOD + factor % MOD;
      r2 = (r2 * factor) % MOD;
      r2 = (r2 * turn_to_inv(a - 1)) % MOD;
      }
  }
}

int main()
{
  ciur_er();
  in >> t;
  for(long long i = 1; i <= t; i++){
    in >> n;
    r1=r2=1;
    decompose(n);
    out << r1 << ' ' << r2 << '\n';
  }
  return 0;
}