Cod sursa(job #2565132)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 2 martie 2020 12:22:07
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MOD = 9973;
const int SQ = 1000004;

int t;
long long N;
int fact[MOD + 5];
vector <int> prime;
bool p[SQ + 5];

void Pre() {
    fact[0] = 1;
    for( int i = 1; i < MOD; ++i )
      fact[i] = ( 1LL * fact[i - 1] * i ) % MOD;

    for( int i = 3; i <= SQ; i += 2 )
      p[i] = true;

    for( int i = 3; i * i <= SQ; i += 2 )
       if( p[i] )
        for( int j = 3; i * j <= SQ; j += 2 )
          p[i * j] = false;

    prime.push_back( 2 );
    for( int i = 3; i <= SQ; i += 2 )
      if( p[i] ) prime.push_back( i );
}

void Do();

void Read()
{
    fin >> t;
    for( int i = 1; i <= t; ++i ) {
       fin >> N;

       Do();
    }
}

int Exp( int v, int p ) {
    if( p == 1 ) return v;

    int ans = Exp( v, p / 2 );

    ans = ( 1LL * ans * ans ) % MOD;
    if( p % 2 ) ans = ( 1LL * ans * v ) % MOD;
    return ans;
}

int InvMod( int val ) {
    return Exp( val, MOD - 2 );
}

void Do()
{
    if( N <= SQ && p[N] ) { fout << 2 << ' ' << N + 1 << '\n'; return; }

    int nrdiv = 1, sumdiv = 1;

    int aux = N;

    for( int i = 0; i < prime.size() && 1LL * prime[i] * prime[i] <= aux; ++i ) {
       int ex = 0;

       while( N % prime[i] == 0 ) {
          ++ex;
          N /= prime[i];
       }

       long long prod = Exp( prime[i], ex + 1 ) - 1;
       if( prod < 0 ) prod += MOD;

       prod = ( 1LL * prod * InvMod( prime[i] - 1 ) ) % MOD;

       nrdiv *= ( ex + 1 );
       sumdiv = ( 1LL * sumdiv * prod ) % MOD;
    }

    if( N > 1 ) {
       nrdiv *= 2;
       long long prod = Exp( N, 2 ) - 1;
       if( prod < 0 ) prod += MOD;

       prod = ( 1LL * prod * InvMod( N - 1 ) ) % MOD;
       sumdiv = ( 1LL * sumdiv * prod ) % MOD;
    }

    fout << nrdiv << ' ' << sumdiv << '\n';
}

int main()
{
    Pre();
    Read();

    return 0;
}