Cod sursa(job #2565253)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 2 martie 2020 13:01:24
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 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;
vector <int> prime;
bool p[SQ + 5];

void Pre() {
    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()
{
    //ios::sync_with_stdio(false);
    cin.tie(0);

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

       Do();
    }
}

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

    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; }

    long long nrdiv = 1, sumdiv = 1;
    long long aux = N;

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

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

       if( ex > 0 ) {
       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;
}