Cod sursa(job #756767)

Utilizator ChallengeMurtaza Alexandru Challenge Data 10 iunie 2012 13:49:24
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.28 kb
#include <fstream>

using namespace std;
const char InFile[]="sumdiv.in";
const char OutFile[]="sumdiv.out";
const long long MOD=9901;

#define Nrdivm (1<<14)
#define Nrpfm 10

long long A,B,REZ;
ifstream fin(InFile);
ofstream fout(OutFile);

long long power(long long a, long long n)
{
    if(!n)
        return 1;

    long long v=power(a,n>>1);

    if(n&1)
        return v*v%MOD*(a%MOD)%MOD;
    return v*v%MOD;
}

long long sum(long long p, long long n)
{
    if(!n)
        return 1;
    if(n&1)
        return sum(p,n>>1)*(power(p,(n>>1)+1)+1)%MOD;
    return (sum(p,n-1)+power(p,n))%MOD;
}


int main()
{
	fin>>A>>B;
    fin.close();

    long long Div[Nrdivm],Pf[Nrpfm],M[Nrpfm],nrdiv=0,nrpf=0;

    for(register long long i=1;i*i<=A;++i)
	{
        if(A%i==0)
		{
            Div[++nrdiv]=i;
		}
	}
    for(register long long i=nrdiv;i;--i)
	{
        Div[++nrdiv]=A/Div[i];
	}
    for(register long long i=2+(A==1);i<=nrdiv;++i)
	{
        if(A%Div[i]==0)
        {
            Pf[++nrpf]=Div[i];
            M[nrpf]=0;
            while(A%Div[i]==0)
            {
                ++M[nrpf];
                A/=Div[i];
            }
        }
	}
    REZ=1;
    for(register long long i=1;i<=nrpf;++i)
	{
        REZ=REZ*sum(Pf[i],M[i]*B)%MOD;
	}
    
	fout<<REZ;
	fout.close();
    return 0;
}