Cod sursa(job #496236)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 28 octombrie 2010 10:23:53
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<cstdio>

const int MOD=9901;
int B;
const int N=1<<20;

void fisiere()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
}

int np;
int exp[30000],div[30000];
void descomp(int a)
{
	int d=2,e;
	
	while (d*d<=a)
	{
		if (a%d)
		{
			++d;
			continue;
		}
		
		e=0;
		while (a%d==0)
		{
			++e;
			a/=d;
		}
		
		exp[++np]=e;
		div[np]=d;
		++d;
	}
	
	if (a!=1)
	{
		exp[++np]=1;
		div[np]=a;
	}
		
}
void citeste()
{
	int A;
	fisiere();
	scanf("%d%d",&A,&B);
	descomp(A);
}

int put(int p,int e)
{
	if (e==0) return 1;
	if (e%2==0) 
		return put((p*p)%MOD,e/2)%MOD;
	return p*put((p*p)%MOD,e/2)%MOD;
}

int inv[30000];
void inverse()
{
	int i;
	inv[1]=1;
	for (i=2;i<MOD;++i)
		if (inv[i]==0)
		{
			inv[i]=put(i,MOD-2);
			inv[inv[i]]=i;
		}
}

void rezolva()
{
	int s=1,i;
	for (i=1;i<=np;++i)
		exp[i]=exp[i]*B;
	for (i=1;i<=np;++i)
		if (div[i]%MOD-1!=0)
			
		{
			s*=(put(div[i],exp[i]+1)+MOD-1)%MOD;
			s*=inv[(div[i]+MOD-1)%MOD];
		}
		 else
			s*=(exp[i]+1)%MOD;
	printf("%d",s);
}

int main()
{
	citeste();
	inverse();
	rezolva();
	return 0;
}