Cod sursa(job #1886029)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 20 februarie 2017 16:46:51
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

using namespace std;

const int MOD = 9901;

int a, b;

int pow(int baza, int exp) {
    int ans = 1;
    baza %= MOD;
    for( ; exp; exp >>= 1) {
        if(exp & 1)
            ans = (ans * baza) % MOD;
        baza = (baza * baza) % MOD;
    }
    if(ans == 0)
        ans += MOD;
    return ans;
}

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

void descompunere() {
    int d = 2, e, rasp = 1, invers, y;
    while(d * d <= a && a > 1) {
        e = 0;
        while(a % d == 0) {
            a /= d;
            ++ e;
        }
        if(e > 0) {
            e *= b;
            gcd(d - 1, MOD, invers, y);
            if(invers <= 0)
                invers = MOD + invers % MOD;
            rasp = ( ((rasp * (pow(d, e + 1) - 1)) % MOD) * invers ) % MOD;
        }
        ++ d;
    }
    if(a > 1) {
        e = b;
        d = a;
        gcd(d - 1, MOD, invers, y);
        if(invers <= 0)
            invers = MOD + invers % MOD;
        rasp = ( ((rasp * (pow(d, e + 1) - 1)) % MOD) * invers ) % MOD;
    }
    printf("%d", rasp);
}

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

    scanf("%d%d", &a, &b);
    descompunere();

    return 0;
}