Cod sursa(job #1443804)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 28 mai 2015 17:50:49
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#include<iostream>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
const int NMAX = 1000005;
const int MOD = 9973;
#define ll long long

ll P[NMAX],viz[NMAX],T,nr,N;

void ciur()
{

    P[++nr] = 2;
    for(ll i = 3 ; i < NMAX ; i += 2)
        if(!viz[i]){
            P[++nr] = i;
            for(ll j = i*i ; j < NMAX ; j += i)
                viz[j] = 1;
        }
}

ll pow(ll e,ll b)
{

    ll rez = 1;
    b %= MOD;
    while(e){
        if(e % 2){

            rez = (rez * b) % MOD;
            --e;
        }
        b = (b * b) % MOD;
        e /= 2;
    }
    return rez;
}

void solve()
{

    ll nd = 1,sd = 1;
    for(ll i = 1 ; i <= nr && 1LL*P[i] * P[i] <= N ; ++i){
        if(N % P[i])
            continue;
        ll p = 0;
        while(N % P[i] == 0){
            N /= P[i];
            ++p;
        }

        nd = nd * (p + 1);
        ll p1 = (pow(p + 1,P[i]) - 1) % MOD;
        ll p2 = pow(MOD - 2,P[i] - 1) % MOD;
        sd = (((sd * p1)%MOD) * p2) % MOD;
    }
    if(N > 1) {
        nd *= 2;
        sd = (1LL*sd*(N+1) % MOD);
    }
    out<<nd<<" "<<sd<<"\n";
}

int main()
{

    ciur();
    in>>T;
    for( ; T ; --T){
        in>>N;
        solve();
    }
    return 0;
}