Cod sursa(job #2502590)

Utilizator robx12lnLinca Robert robx12ln Data 1 decembrie 2019 10:46:59
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.85 kb
#include<bits/stdc++.h>
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];
vector<int> P;
vector< pair<int,int> > arr;

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

int main(){

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

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

    for( fin >> T; T; T-- ){
        fin >> N; long long save = N;
        for( int i = 0; i < P.size() && 1LL * P[i] * P[i] <= save && N != 1; i++ ){
            int e = 0;
            while( N % P[i] == 0 ){
                e++;
                N /= P[i];
            }
            if( e != 0 )
                arr.push_back( { P[i], e } );
        }

        int nrd;
        if( N == 1 )
            nrd = 1;
        else
            nrd = 2;
        for( int i = 0; i < arr.size(); i++ )
            nrd = ( nrd * ( arr[i].second + 1 ) ) % MOD;

        int sd;
        if( N == 1 )
            sd = 1;
        else
            sd = ( ( (N * N) % MOD - 1 + MOD ) * lgput( N - 1, MOD - 2 ) ) % MOD;
        for( int i = 0; i < arr.size(); i++ ){
            int aux = lgput( arr[i].first, arr[i].second + 1 ) - 1 + MOD;
            if( aux >= MOD ) aux -= MOD;
            aux = ( aux * invM[ arr[i].first ] ) % MOD;
            sd = ( sd * aux ) % MOD;
        }
        fout << nrd << " " << sd << "\n";
        arr.clear();
    }
    return 0;
}