Cod sursa(job #1016187)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 25 octombrie 2013 21:25:21
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <bitset>
using namespace std;
const int Nmax = 10000;
const int MOD = 9901;
const long long LL = 1;

int A,B,is_prime[1300],nrp;
bitset<Nmax> used;
void precalc()
{
    int i,j;
    is_prime[nrp++] = 2;
    for(i = 1 ; 2*i+1 <= Nmax ;  ++i)
      if(!used[2*i+1]){
        is_prime[nrp++] = 2*i+1;
        for(j = 1; (2*i+1)*(2*j+1) <= Nmax ; ++j)
            used[(2*i+1)*(2*j+1)] = 1;
    }
    scanf("%d%d",&A,&B);
}

int lg_put(int a,int b)
{
    int x1 = a,x2 = 1 ;
    if(b==0)return 1;if(b==1)return a;
    while(b>1)
    {
        if(b&1)
            x2 = (LL*x2*x1)%MOD,--b;
        else
            x1 = (LL*x1*x1)%MOD,(b>>=1);
    }
    return (LL * x1 * x2)%MOD;
}

int calc (int x, int y)
{
    if (x % MOD == 1)
        return (y + 1) % MOD;

    int sol = lg_put(x, y + 1) - 1;

    sol = sol * lg_put(x - 1, 9899) % MOD;
    return sol;
}

void solve()
{
    int p = 0, sd = 1, nr,num;
    for(int i = 0; is_prime[i]*is_prime[i] <= A ; ++i )
    {
        p = 0;
        while(A % is_prime[i] == 0)
        {
            A /= is_prime[i];
            ++p;
        }
        if(p)
            sd = (sd * calc(is_prime[i],p * B)) % MOD;

    }
    if(A > 1)
        sd = (sd * calc(A,B))% MOD ;
     printf("%d",sd);
}

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

    precalc();
    solve();


    return 0;
}