Cod sursa(job #1648065)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 11 martie 2016 00:01:37
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
# include <fstream>
# include <bitset>
# include <vector>

using namespace std;

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

const int MAX = 1e6;
const int MOD = 9973;
vector<int> P;
bitset<MAX> viz;
int T;

int euclid(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }

    int xs, ys, d;
    d = euclid(b, a%b, xs, ys);
    x = ys;
    y = xs - (a/b) * ys;
    return d;
}

int inversModular(int A, int N) {
    int X, Y;
    if (euclid(A, N, X, Y))
        ;

    while (X < 0)
        X += N;

    return X;
}

long long pow(int a, int n) {
    if (n == 0) return 1;
    if (n == 1) return a;
    if (n % 2 == 1) return (a * pow(a, n-1)) % MOD;
    a = pow(a, n>>1);
    return (a*a)%MOD;
}

void ciur() {
    P.push_back(2);
    for (int i=3; i<=MAX; i+=2)
        if (!viz[i]) {
            P.push_back(i);
            for (int j=i+i; j<=MAX; j+=i)
                viz[j] = 1;
        }
}

void ssnd(long long N) {
    int sdiv, nrdiv, i, e, up, down;
    sdiv = nrdiv = 1;
    for (i=0; P[i]*P[i] <= N && i < P.size(); ++i) {
        e = 0;
        while (N % P[i] == 0) {
            ++e;
            N /= P[i];
        }

        if (e > 0) {
            nrdiv *= (e + 1);

            up = pow(P[i], e + 1) - 1;
            down = inversModular(P[i] - 1, MOD);

            sdiv = (((1LL * sdiv * up) % MOD) * down) % MOD;
        }
    }

    if (N > 1) {
        e = 1;
        nrdiv *= (e + 1);
        up = pow(N, e + 1) - 1;
        down = inversModular(N - 1, MOD);

        sdiv = (((1LL * sdiv * up) % MOD) * down) % MOD;
    }

    fout << nrdiv << " " << sdiv << "\n";
}

long long X;
int main() {
    ciur();

    fin >> T;
    while (T--) {
        fin >> X;
        ssnd(X);
    }
    return 0;
}