Cod sursa(job #1648091)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 11 martie 2016 00:38:04
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
#include<bitset>
using namespace std;
const int MODULO = 9973;
const int NMAX = 1000000;
bitset <NMAX+7> viz;
int P[NMAX];
int t, nrprime;
long long n;
void file_init() {
    if (freopen("ssnd.in", "r", stdin)) ;
    if (freopen("ssnd.out", "w", stdout)) ;
}
void file_close() {
    fclose(stdin);
    fclose(stdout);
}
void ciur() {
    for (int i=2; i<=NMAX; ++i) {
        if (!viz[i]) {
            P[++nrprime] = i;
            for (int j=2; i*j<=NMAX; ++j) {
                viz[i*j] = true;
            }
        }
    }
}
long long exp(long long a, int n) {
    if (n == 0) return 1;
    if (n == 1) return a;
    if (n % 2 == 1) return (a * exp(a, n-1)) % MODULO;
    else {
        a = exp(a, n/2);
        return (a * a)% MODULO;
    }
}
void rezolva(long long n) {
    int sdiv = 1;
    int nrdiv = 1;
    for (int i=1; P[i]*P[i]<=n && i <= nrprime; ++i) {
        int e = 0;
        while(n % P[i] == 0) {
            ++e;
            n = n / P[i];
        }
        if (e > 0) {
            nrdiv *= (e + 1);
            int x = (exp(P[i], e + 1) - 1) % MODULO,
                y = (exp(P[i] - 1, MODULO - 2)) % MODULO;
            // Il scriem pe Pi-1 ca fiind inversul sau pentru a aplica modulul
            sdiv = (((1LL * sdiv * x) % MODULO) * y) % MODULO;
        }
    }
    if (n > 1) {
        nrdiv *= 2;
        sdiv = (1LL * sdiv * (n + 1)) % MODULO;
    }
    printf ("%d %d\n", nrdiv, sdiv);
}
int main() {
    file_init();
    ciur();
    if (scanf("%d", &t));
    for (int i=1; i<=t; ++i) {
        if (scanf("%lld", &n));
        rezolva(n);
    }
    file_close();
    return 0;
}