Cod sursa(job #494462)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 21 octombrie 2010 18:30:53
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 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;    
	while(p) 
	{ 
		if(p&1)
		{ 
			pp*=a; 
			pp%=MOD; 
		} 
		a*=a;
		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;
}