Cod sursa(job #494442)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 21 octombrie 2010 17:51:22
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 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 eucl(int a,int b,int &x,int &y,int &d)
{
    if(b==0)
    {
        x=1;
        y=0;
        d=a;
        return ;
    }
    int x1,y1;
    eucl(b,a%b,x1,y1,d);
    x=y1;
    y=x1-(a/b)*y1;
}
int inversmod(int A)
{
	int x,y,d;
	x=y=d=0;
    eucl(A,MOD,x,y,d);
    if(x>0)
       return (x%MOD);
    else  return (MOD+x%MOD);
    return 0;
}
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++)
	{
		nrd*=(((lgput(nr[i],put[i]+1)-1)%MOD)*inversmod(nr[i]%MOD-1))%MOD;
		nrd%=MOD;
	}
	printf("%d",nrd);
	return 0;
}