Cod sursa(job #496228)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 28 octombrie 2010 10:11:40
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 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)
	{
		s*=(put(div[i],exp[i]+1)+MOD-1)%MOD;
		s*=inv[(div[i]+MOD-1)%MOD];
	}
	printf("%d",s);
}

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