Cod sursa(job #640925)

Utilizator ELHoriaHoria Cretescu ELHoria Data 26 noiembrie 2011 19:52:38
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <fstream>

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

const int MOD = 9901;
int A , B , sd ;

int lgpow(int x,int y)
{
	int ans = 1;
	for(;y;y>>=1)
	{
		if(y & 1) 
			ans = (ans*x)%MOD , y--;

		x = (x*x)%MOD;
	}
	return ans;
}

void solve(int nr)
{
	int p = 0 , nr1 , nr2;
	sd = 1;
	for(int d=2;d*d<=nr;d++)
		if(nr%d==0)
		{
			
			while(nr%d==0) nr/=d , p++;
			p*=B;
			if(nr%MOD==1)
				sd = sd*((nr+1)%MOD)%MOD;
			else
			{
			nr1 = (lgpow(d,p+1)-1)%MOD;
			nr2 = lgpow(d-1,MOD-2)%MOD;
			sd = ((sd * nr1) *nr2)%MOD;
			}
		}
	if(nr>1)
	{
		p = B;
		if(nr%MOD==1)
			sd = sd*((nr+1)%MOD)%MOD; 
		else
		{
		nr1 = (lgpow(nr,p+1)-1)%MOD;
		nr2 = lgpow(nr-1,MOD-2)%MOD;
		sd = ((sd * nr1)%MOD *nr2)%MOD;
		}
	}

}

int main()
{
	fin>>A>>B;
	solve(A);
	fout<<sd<<"\n";
	return 0;
}