Cod sursa(job #1941378)

Utilizator DobosDobos Paul Dobos Data 27 martie 2017 11:20:18
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define NMAX 1000005
#define MOD 9973
using namespace std;

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

bitset < NMAX > B;

vector < int > V;


int POW(int N,int p){
    int m = 1;
    N = N % MOD;
    while(p != 0){

        if(p % 2 == 1){
            m = m * N;
            m = m % MOD;
        }
        p /= 2;
        N = (N * N) % MOD;
    }
    return m;
}


void ciur(){
    for(int i = 2; i < NMAX; i++){

        if(B[i] == 0){
            V.push_back(i);
            for(int j = i + i; j < NMAX; j += i)
                B[j] = 1;

        }
    }
}



inline void getans
(){
    long long N;
    int S = 1,D = 1,p,p1,p2;

    fin >> N;

    for(int i = 0; i < V.size() && N >= V[i] * V[i]; i++){
        if(N % V[i] != 0) continue;
        p = 0;
        while(N % V[i] == 0){
            N /= V[i];
            p++;
        }

        D *= p + 1;

        p1 = (POW(V[i],p + 1) - 1) % MOD;
        p2 = POW(V[i] - 1,MOD - 2) % MOD;

        S = (((S * p1) % MOD) * p2) % MOD;

    }

    if(N > 1){
        D *= 2;
        S = (1LL * S * (N + 1)) % MOD;
    }

    fout << D << " " << S << "\n";

}


int main()
{
    ios :: sync_with_stdio(false);

    int T;

    ciur();


    fin >> T;

    while(T--){
        getans();
    }


 //   cout << "Hello world!" << endl;
    return 0;
}