Cod sursa(job #1442779)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 26 mai 2015 11:51:58
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

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

const int NMax = 1000005;
const int MOD = 9973;

int P[NMax],p;
bitset < NMax > eur;

void ciur(){
    P[++p] = 2;
    for(int i = 4; i < NMax; i += 2){
        eur[i] = 1;
    }
    for(int i = 3; i < NMax; i += 2){
        if(!eur[i]){
            P[++p] = i;
            for(int j = 2 * i; j < NMax; j += i){
                eur[j] = 1;
            }
        }
    }
}

int paw(int x, int l){
    int rez = 1;
    x %= MOD;
    while(l){
        if(l & 1){
            rez *= x;
            rez %= MOD;
        }
        x *= x;
        x %= MOD;
        l >>= 1;
    }
    return rez;
}

void solve(){
    long long int x;
    fin >> x;
    int dv = 0, sd = 1, nd = 1;
    for(int i = 1; i <= p && 1LL * P[i] * P[i] <= x; i++){
        if(x % P[i] == 0){
            dv = 0;
            while(x % P[i] == 0){
                dv++;
                x /= P[i];
            }
            nd *= (dv + 1);
            int p1 = (paw(P[i], dv + 1) % MOD - 1) % MOD;
            int p2 = paw(P[i] - 1, MOD - 2) % MOD;
            sd = (((sd * p1) % MOD) * p2) % MOD;
        }
    }
    if(x > 1){
        nd *= 2;
        sd = (1LL * sd * (x + 1)) % MOD;
    }
    fout << nd << " " << sd << "\n";
}

int main(){
    ciur();
    int t;
    fin >> t;
    while(t--){
        solve();
    }
    return 0;
}