Cod sursa(job #756413)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 9 iunie 2012 16:44:48
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.19 kb
#include <cstdio>
#include <vector>

#define Mod 9901
#define p first
#define e second
#define LL long long

using namespace std;

int A, B, S;
vector < pair <int, LL> > F;

inline int Pow (int X, LL P)
{
    int R=1; X%=Mod;
    while (P)
    {
        if (P%2==0) X=(X*X)%Mod, P/=2;
        else R=(R*X)%Mod, --P;
    }
    return R;
}

inline int MI (int X)
{
    return Pow (X, (LL)Mod-2);
}

void Decompose ()
{
    for (int i=2; i*i<=A and A>1; ++i)
    {
        if (A%i==0) F.push_back (make_pair (i, 0));
        for (; A%i==0; A/=i, ++F.back ().e);
    }
    if (A>1) F.push_back (make_pair (A, 1));
    for (unsigned i=0; i<F.size (); ++i) F[i].e*=B;
}

inline int ComputeF (int X, LL P)
{
    return (((Pow (X, P+1)-1+Mod)%Mod)*MI (X-1))%Mod;
}

void Solve ()
{
    Decompose ();
    S=1;
    for (unsigned i=0; i<F.size (); ++i)
    {
        S=(S*ComputeF (F[i].p, F[i].e))%Mod;
    }
}

void Read ()
{
    freopen ("sumdiv.in", "r", stdin);
    scanf ("%d %d", &A, &B);
}

void Print ()
{
    freopen ("sumdiv.out", "w", stdout);
    printf ("%d\n", S);
}

int main ()
{
    Read ();
    Solve ();
    Print ();
    return 0;
}