Cod sursa(job #2502605)

Utilizator robx12lnLinca Robert robx12ln Data 1 decembrie 2019 11:03:48
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
using namespace std;

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

const int DIM = 1e6;
const int MOD = 9973;

int T;
bool w[DIM + 5];
long long N;
int invM[DIM], P[DIM / 10 + 5], K;

inline int lgput( int x, int p ){
    int r = 1;
    x %= MOD;
    while( p > 0 ){
        if( (p & 1) == 1 ){
            r *= x;
            r %= MOD;
        }
        x *= x;
        x %= MOD;
        p >>= 1;
    }
    return r;
}

int main(){
    K = 0;
    w[0] = w[1] = 1;
    for( int i = 1; i <= DIM; i++ ){
        if( w[i] == 0 ){
            P[++K] = i;
            for( int j = i + i; j <= DIM; j += i )
                w[j] = 1;
        }
    }

    for( int i = 1; i <= K; i++ )
        invM[ P[i] ] = lgput( P[i] - 1, MOD - 2 );

    for( fin >> T; T; T-- ){
        fin >> N;
        int nrd = 1;
        int sd = 1;
        for( int i = 1; i <= K && 1LL * P[i] * P[i] <= N; i++ ){
            if( N % P[i] != 0 )
                continue;
            int e = 0;
            while( N % P[i] == 0 ){
                e++;
                N /= P[i];
            }
            if( e == 0 )
                continue;
            nrd *= (e + 1);
            int aux = lgput( P[i], e + 1 ) - 1 + MOD;
            if( aux >= MOD ) aux -= MOD;
            sd = ( ( ( sd * aux ) % MOD ) * invM[ P[i] ] ) % MOD;
        }

        if( N != 1 ){
            nrd = 2 * nrd;
            sd = ( 1LL * sd * (N + 1) ) % MOD;
        }
         fout << nrd << " " << sd << "\n";
    }
    return 0;
}