Cod sursa(job #1260135)

Utilizator smaraldaSmaranda Dinu smaralda Data 10 noiembrie 2014 22:08:56
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<math.h>
 
#define LL long long
const int MOD = 9901, NMAX = 30;
 
int nfact;
LL a, b, res;
 
LL lgPow (LL x, LL expo) {
    if(expo == 0)
        return 1;
 
    if(expo & 1)
        return (x * lgPow(x, expo - 1)) % MOD;
 
    LL half = lgPow(x, expo / 2);
    return (half * half) % MOD;
}

LL invMod (LL x) {
    return lgPow(x, MOD - 2);
}

void fact (LL n) {
    LL d, f, lim, e;
 
    lim = sqrt(n);
    d = 2;
    res = 1;
    while(n > 1 && d <= lim) {
        e = 0;
        while(n % d == 0)
            ++ e,
            n /= d;
        if(e) {
            e *= b;

            if(d % MOD == 1) 
                res = (res * (b + 1)) % MOD;
            else 
                res = (res * ((lgPow(d, e + 1) - 1 + MOD) % MOD) * invMod(d - 1)) % MOD;
        }
        ++ d;
    }
    if(n > 1) {
        if(n % MOD == 1)
            res = (res * (b + 1)) % MOD;
        else
            res = (res * ((lgPow(n, b + 1) - 1 + MOD) % MOD) * invMod(n - 1)) % MOD;
    }
}

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

    scanf("%lld%lld", &a, &b);
    if(b == 0) {
        printf("1\n");
        return 0;
    }

    fact(a);
  
    printf("%lld\n", res);
    return 0;
}