Cod sursa(job #2066667)

Utilizator tqmiSzasz Tamas tqmi Data 15 noiembrie 2017 11:44:39
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
using namespace std;
 
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int MOD = 9973;
const int VMax = 1000000;
bool P[VMax + 5];
int Prim[80000],k;
long long N;
int T,Nr,Sum;
 
void Sieve()
{
  for(int i = 2; i<= VMax; ++i)
  {
    if(P[i] == 0)
    {
      Prim[++k] = i;
      for(int j = i; j <= VMax; j += i)
        P[j] = 1;
    }
  }
}
 
int Power(int N, int P)
{
  int Sol = 1;
  while(P)
  {
    if(P%2 == 1)
      Sol = ( 1LL * Sol * N)%MOD;
    N = (1LL * N*N)%MOD;
    P = P / 2;
  }
  return Sol;
}
int Invers(int N)
{
  return Power(N,MOD-2);
}
int main()
{
    Sieve();
    fin >> T;
    while(T--)
    {
      fin >> N;
 
      Nr = Sum = 1;
      for(int i = 1; (i <= k) && 1LL*Prim[i]*Prim[i] <= N; ++i)
      {
        int e = 0;
        while(N%Prim[i] == 0)
        {
          N = N/Prim[i];
          e++;
        }
        if(e)
        {
          Nr *= (e+1);
          Sum = (1LL *Sum * (1LL*((Power(Prim[i],e+1)-1)%MOD) * Invers(Prim[i]-1))%MOD)%MOD;
        }
      }
 
      if(N != 1)
      {
        Nr = (Nr * 2);
        Sum = (1LL * Sum * (N+1)) % MOD;
      }
 
 
      fout << Nr << " " << Sum << "\n";
    }
    return 0;
}