Cod sursa(job #1885936)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 20 februarie 2017 15:55:46
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MOD = 9973;

vector <int> prime;

bool c[1000005];
void ciur() {
    prime.push_back(2);
    int n = 1000000, radn = 1000;
    for(int i = 3; i <= radn; i += 2)
        if(!c[i])
            for(int j = i * i; j <= n; j += 2 * i)
                c[j] = 1;
    for(int i = 3; i <= n; i += 2)
        if(!c[i])
            prime.push_back(i);
}

void gcd(int x, int y, int &a, int &b) {
    if(y == 0) {
        a = 1;
        b = 0;
    } else {
        gcd(y, x % y, a, b);
        int backup = a;
        a = b;
        b = backup - b * (x / y);
    }
}

int poww(int a, int b) {
    int rasp = 1;
    for( ; b; b >>= 1) {
        if(b & 1) {
            rasp *= a;
            rasp %= MOD;
        }
        a = a * a;
        a %= MOD;
    }
    return rasp;
}

void descompunere(int n) {
    int ind = 0, d, e, raspA = 1, raspB = 1, invers, y;
    while(ind < prime.size() && prime[ind] * prime[ind] <= n && n > 1) {
        d = prime[ind];
        e = 0;
        while(n % d == 0) {
            n /= d;
            ++ e;
        }

        raspA = ( raspA * (e + 1) ) % MOD;
        gcd(d - 1, MOD, invers, y);
        while(invers < 0)
            invers += MOD;
        raspB = ((raspB * (poww(d, e + 1) - 1) % MOD) * invers) % MOD;
        ++ ind;
    }
    if(n > 1) {
        d = n;
        e = 1;
        raspA = ( raspA * (e + 1) ) % MOD;
        gcd(d - 1, MOD, invers, y);
        while(invers < 0)
            invers += MOD;
        raspB = ((raspB * (poww(d, e + 1) - 1) % MOD) * invers) % MOD;
    }
    printf("%d %d\n", raspA, raspB);
}

int main() {
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    ciur();

    int t, a;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &a);
        descompunere(a);
    }

    return 0;
}