Cod sursa(job #883724)

Utilizator visanrVisan Radu visanr Data 20 februarie 2013 12:12:16
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
//Descompun pe A in factori primi, iar A ^ B = P1 ^ K1 * P2 ^ K2 * ...
//Rezultatul e un produs de sume de termeni din progresii geometrice

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define Mod 9901

int Ans = 1, A, B;

int LgPow(int N, int P)
{
    int Now = 1;
    N %= Mod;
    while(P)
    {
        if(P % 2) Now = (Now * N) % Mod;
        N = (N * N) % Mod;
        P /= 2;
    }
    return Now;
}

int InvMod(int A)
{
    return LgPow(A, Mod - 2) % Mod;
}

int main()
{
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out", "w", stdout);
    int i, j;
    scanf("%i %i", &A, &B);
    for(i = 2; i * i <= A; i++)
    {
        int Exp = 0;
        while(A % i == 0) Exp ++, A /= i;
        Exp *= B;
        if(Exp)
        {
            if(i % Mod == 1) Ans = (Ans * (Exp + 1)) % Mod;
            else Ans = (Ans * (LgPow(i, Exp + 1) - 1 + Mod) % Mod * LgPow(i - 1, Mod - 2)) % Mod;
        }
    }
    if(A > 1)
    {
        if(A % Mod == 1) Ans = (Ans * (B + 1)) % Mod;
        else Ans = (Ans * (LgPow(A, B + 1) - 1 + Mod) % Mod * LgPow(A - 1, Mod - 2)) % Mod;
    }
    printf("%i\n", Ans);
    return 0;
}