Cod sursa(job #183004)

Utilizator razvi9Jurca Razvan razvi9 Data 21 aprilie 2008 17:01:00
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<cstdio>
const int mod=9901;
int inv[9901],i,j,x,y,a,b,ciur[8000],prime[8000];
long long n;
void invers(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
	}
	else
	{
		int x0,y0;
		invers(b,a%b,x0,y0);
		x=y0;
		y=x0-(a/b)*y0;
	}
}
int pow(int a,int b)
{
	if(b==1)
		return a;
	int x=pow(a,b>>1);
	x=(x*x)%mod;
	if(b&1) x=(x*a)%mod;
	return x;
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	inv[1]=1;
	for(i=2;i<mod;i++)
		if(!inv[i])
		{
			invers(i,mod,x,y);
			if(x<0) x=x+mod;
			x=x%mod;
			inv[i]=x;
			inv[x]=i;
		}
	for(i=2;i<8000;i++)
		if(ciur[i]==0)
			for(j=2*i;j<8000;j+=i)
				ciur[j]=1;
	for(i=2;i<8000;i++)
		if(ciur[i]==0) prime[++prime[0]]=i;
	scanf("%d %d",&a,&b);
	if(a!=1 && b) 
	{
		i=1;
		n=1;
		while(prime[i]*prime[i]<=a && n)
		{
			x=0;
			while(a%prime[i]==0)
				a/=prime[i],x++;
			if(x)
			{
				y=pow(prime[i],x*b+1);
				if(!y) y=mod;
				n=(n*(y-1)*inv[(prime[i]-1)%mod])%mod;
			}
			i++;
		}
		if(a!=1 && n)
		{
			if(a%mod!=1)
			{
				y=pow(a%mod,b+1);
				n=(n*(y-1)*inv[(a-1)%mod])%mod;
			}
			else
			{
				n=(n*(b+1))%mod;
			}
		}
	}
	else
		n=1;
	printf("%lld\n",n);
	fclose(stdout);
	return 0;
}