Cod sursa(job #1100524)

Utilizator gabrielvGabriel Vanca gabrielv Data 6 februarie 2014 22:32:35
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>

using namespace std;

#define MAX 7200
#define MAX2 930
#define MOD 9901

int A,B;
int k;
int S;
int prim[MAX2];

bool ciur[MAX];

void ciur_er()
{
    int i,j;
    k = 1;
    prim[k]=2;
    for(i=3;i<MAX-1;i+=2)
        if(!ciur[i])
        {
            prim[++k]=i;
            for(j=i+i+i;j<MAX-1;j+=i+i)
                ciur[j]=1;
        }
}

int pow(int N, long long P)
{
    int sol=1;
    N%=MOD;
    while(P)
    {
        if(P&1)
            sol=(sol*N)%MOD;
        N=(N*N)%MOD;
        P>>=1;
    }
    return sol;
}

void Scannen()
{
    freopen("sumdiv.in","r",stdin);

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

int Berechnen(int nr, int exp)
{
    if(nr%MOD==1)
        return exp*B+1;
    return (pow(nr,1LL*exp*B+1)+MOD-1)*(pow(nr-1,MOD-2))%MOD;
}

void Lossen()
{
    ciur_er();

    S=1;

    for(int i=1,p;(prim[i]*prim[i]<=A)&&(i<=k);i++)
    {
        if(A%prim[i])
            continue;
        p=0;
        while(A%prim[i]==0)
        {
            A=A/prim[i];
            p++;
        }
        S=(S*Berechnen(prim[i],p))%MOD;
    }
    if(A!=1)
        S=(S*Berechnen(A,1))%MOD;
}

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

int main()
{
    Scannen();
    Lossen();
    Drucken();
    return 0;
}