Cod sursa(job #756241)

Utilizator jumper007Raul Butuc jumper007 Data 9 iunie 2012 12:43:56
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 0.93 kb
using namespace std;
#include<cstdio>
#define MAX 7200
#define MAX2 930
#define MOD 9901
bool ciur[MAX];
int prim[MAX2],k=1,A,B;
void ciur_er()
{
	int i,j;
	prim[k]=2;
	for(i=3;i<MAX-1;i+=2)
		if(!ciur[i])
		{
			prim[++k]=i;
			for(j=i+i+i;j<MAX-1;j+=i+i)
				ciur[j]=1;
		}
}
int pow(int N, long long P) // exponentiere in timp logaritmic
{
	int sol=1;
	N%=MOD;
	while(P)
	{
		if(P&1)
			sol=(sol*N)%MOD;
		N=(N*N)%MOD;
		P>>=1;
	}
	return sol;
}
int solve(int nr, int exp)
{
	if(nr%MOD==1)
		return exp*B+1;
	return (pow(nr,1LL*exp*B+1)+MOD-1)*(pow(nr-1,MOD-2))%MOD;
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	ciur_er();
	int S=1,i,p;
	scanf("%d %d",&A,&B); // A la puterea B
	for(i=1;(prim[i]*prim[i]<=A)&&(i<=k);i++)
	{
		if(A%prim[i])
			continue;
		p=0;
		while(A%prim[i]==0)
		{
			A=A/prim[i];
			p++;
		}
		S=(S*solve(prim[i],p))%MOD;
	}
	if(A!=1)
		S=(S*solve(A,1))%MOD;
	printf("%d\n",S);
	return 0;
}