Cod sursa(job #756732)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 10 iunie 2012 13:19:00
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.28 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>

using namespace std;

#define MOD 9901
int A, B, d, S;

int put(int a, int p) {
    int r = 1;
    while(p) {
        if(p & 1) r = ((long long)r * a) % MOD;
        a = ((long long)a * a) % MOD;
        p /= 2;
    }
    return r;
}

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

	scanf("%d %d", &A, &B);

    S = 1;
    for(d = 2; d * d <= A; d++)
        if(A % d == 0) {
            int p = 0;
            while(A % d == 0) {
                A /= d;
                p++;
            }

            int n1 = (put(d, p * B + 1) - 1 + MOD) % MOD;
            int n2 = put(d - 1, MOD - 2);

            S = (long long)(S * n1) % MOD;
            S = (long long)(S * n2) % MOD;
        }
    if(A > 1) {
        int n1 = (put(A, B + 1) - 1 + MOD) % MOD;
        int n2 = put(A - 1, MOD - 2);
        S = (long long)(S * n1) % MOD;
        S = (long long)(S * n2) % MOD;
    }

    printf("%d", S);

	return 0;
}