Cod sursa(job #1612798)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 25 februarie 2016 01:10:07
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
///Problema Sumdiv - InfoArena ( www.infoarena.ro/problema/sumdiv )
#include <cstdio>
#include <vector>

#define in "sumdiv.in"
#define out "sumdiv.out"
#define pb push_back
#define MOD 9901

using namespace std;
int A, B, sum = 1, sze;
vector <int> prim, exp;

int power(int a, int b)
{
    int sol = 1;
    for( ; b; b>>=1)
    {
        if(b&1)
        {
            sol = (1LL*sol*a)%MOD;
        }
        a = (1LL*a*a)%MOD;
    }
    return sol;
}

inline void build()
{
    int ct = 0;
    for(int i = 2; i*i <= A; ++i)
    {
        if(A%i) continue;
        ct = 0;
        prim.pb(i);
        while(A%i == 0)
        {
            ++ct;
            A/=i;
        }
        exp.pb(ct);
    }
    if(A != 1)
    {
        prim.pb(A);
        exp.pb(1);
    }
}
inline void solve()
{
    sze = prim.size();
    for(int i = 0; i< sze; ++i)
    {
        int tmpSum = (1LL*(power(prim[i], exp[i]*B + 1) - 1 + MOD))%MOD;
        tmpSum = (1LL * tmpSum * power(prim[i] - 1, MOD-2))%MOD;
        sum = (1LL*sum*tmpSum)%MOD;
    }
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    scanf("%d %d", &A, &B);
    build();
    solve();
    printf("%d\n", sum);
    return 0;
}