Cod sursa(job #1443814)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 28 mai 2015 18:01:04
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>
#include<bitset>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
const int NMAX = 1000005;
const int MOD = 9973;

int P[NMAX],T,nr;
bitset<NMAX> viz;
long long N;

void ciur()
{

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

int pow(int e,int b)
{

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

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

void solve()
{

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

        nd = nd * (p + 1);
        int p1 = (pow(p + 1,P[i]) - 1) % MOD;
        int 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;
}