Cod sursa(job #2502599)

Utilizator robx12lnLinca Robert robx12ln Data 1 decembrie 2019 10:59:13
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.63 kb
#include<bits/stdc++.h>
using namespace std;

FILE * fin = fopen("ssnd.in","r");
FILE * fout = fopen("ssnd.out","w");

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( fscanf( fin, "%d", &T ); T; T-- ){
        fscanf( fin, "%lld", &N );
        long long save = N, nrd = 1;
        int sd = 1;
        for( int i = 1; i <= K && 1LL * P[i] * P[i] <= save && N != 1; 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;
        }
        fprintf( fout, "%lld %d\n", nrd, sd );
    }
    return 0;
}