Cod sursa(job #550403)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 9 martie 2011 14:42:54
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include<cstdio>
const int MOD=9901;
int q,nr[1<<17],put[1<<17];
int lgput(int n,int p)
{
	int pp,a;
	pp=1;
	a=n%MOD;
	while(p)
	{
		if(p&1)
		{
			pp*=(a%MOD);
			pp%=MOD;
		}
		a*=(a%MOD);
		a%=MOD;
		p>>=1;
	}
	return pp;
}
void desc(int x)
{
	for(int i=2;i*i<=x;i++)
		if(x%i==0)
		{
			int p=0;
			while(x%i==0)
				p++,x/=i;
			++q;
			nr[q]=i;
			put[q]=p;
		}
	if(x>1)
	{
		++q;
		nr[q]=x;
		put[q]=1;
	}
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	int a,b;
	scanf("%d%d",&a,&b);
	desc(a);
	for(int i=1;i<=q;i++)
		put[i]*=b;
	int nrd=1;
	for(int i=1;i<=q;i++)
	{
		if(nr[i]%MOD-1!=0)
			nrd*=(((lgput(nr[i],put[i]+1)-1+MOD)%MOD)*lgput((nr[i]%MOD-1+MOD)%MOD,MOD-2))%MOD;
		else nrd*=((put[i]+1)%MOD);
		nrd%=MOD;
	}
	printf("%d",nrd);
	return 0;
}