Cod sursa(job #1908902)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 7 martie 2017 10:53:44
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int mod = 9973;

long long T,N;

long long getPhi(long long);
long long pw(long long,long long);
// getPhi(N) - return-eaza numarul de numere mai mici sau egale cu N care au cmmdc(nr,N) = 1 (indicatorul lui Euler)
// pw(b,e) - return-eaza (b^e) % mod;

int main() {
    in>>T;

    long long totient = getPhi(mod);
    while (T--) {
        in>>N;

        long long nrDiv = 1,sumTop = 1,sumBot = 1;

        for (long long i=2; i*i<=N ;++i) {
            if (N % i == 0) {
                long long d = 0;
                while (N % i == 0) {
                    N /= i;
                    ++d;
                }
                nrDiv *= (d+1);

                sumTop = (sumTop * (pw(i,d+1) - 1)) % mod;
                sumBot = (sumBot * (i - 1)) % mod;
            }
        }
        if (N != 1) {
            nrDiv *= 2;
            sumTop = (sumTop * (pw(N,2) - 1)) % mod;
            sumBot = (sumBot * (N - 1)) % mod;
        }

        out<<nrDiv<<' '<<(sumTop * pw(sumBot,totient-1)) % mod<<'\n';
    }
    in.close();out.close();
    return 0;
}

long long getPhi(long long x) {

    long long phi = x;

    for (long long i=2; i*i <= x;++i) {
        if (x % i == 0) {
            while (x % i == 0) {
                x /= i;
            }
            phi = phi * (i-1) / i;
        }
    }
    if (x != 1) {
        phi = phi * (x-1) / x;
    }
    return phi;
}

long long pw(long long x,long long e) {
    long long prod = 1;

    while (e) {
        if (e%2 == 1) {
            prod = (prod * x) % mod;
        }
        x = (x*x) % mod;
        e >>= 1;
    }

    return prod;
}