Cod sursa(job #539755)

Utilizator SadmannCornigeanu Calin Sadmann Data 23 februarie 2011 12:29:16
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#define MOD 9901
int cnt,i=2,sol=1;
long long A,B;
FILE *in,*out;

int putere(int a,int b)
{
    int rez=1,n=a%MOD;
    for(int q=0;(1<<q)<=b;q++)
    {
        if((1<<q) & b)
            rez=(rez*n)%MOD;
        n=(n*n)%MOD;
    }

    return rez;
}

int sum(int a,int b)
{
    if(b==1)
        return a%MOD;
    if(b & 1)
        return(sum(a,b-1)+putere(a,b))%MOD;
    return ((putere(a,b/2)+1)*sum(a,b/2))%MOD;
}

int main()
{
    in=fopen("sumdiv.in","rt");
    out=fopen("sumdiv.out","wt");
    fscanf(in,"%lld %lld",&A,&B);
    if(!B)
    {
        fprintf(out,"1\n");
        return 0;
    }
    for(i=2;i*i<=A;i++)
    {
        if(!(A%i))
        {
            for(;A%i==0;)
            {
                A/=i;
                cnt++;
            }
            sol=sol*(sum(i,cnt*B)+1)%MOD;
        }
    }
    if(A!=1)
        sol=sol*(sum(A,B)+1)%MOD;

    fprintf(out,"%d",sol);
    return 0;
}