Cod sursa(job #582537)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 15 aprilie 2011 15:16:39
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<cstdio>

using namespace std;
#define MOD 9901
#define LL long long
int N,M;
LL suma=1,baza=0;
inline int mod(int a)
{
	if (a>=MOD)
		a%=MOD;
	return a;
}
inline LL putere(LL n,int p)
{
	if (!p)
		return 1;
	if (p&1)
		return ((n%MOD)*putere((n%MOD)*(n%MOD),p>>1))%MOD;
	return (putere((n%MOD)*(n%MOD),p>>1))%MOD;
}
inline void desc()
{
	int i=2;
	for ( i=2; i*i<=N ; ++i)
	{
		if (N%i!=0)
			continue;
		int p=0;
		while (N%i==0)
		{
			N/=i;
			++p;
		}
		if (!p)
			continue;
		int n=mod(i);
		baza=putere((LL)n,M*p+1);
		if (baza-1<0)
			baza=MOD-baza;
		n=mod(i);
		suma=mod((LL)(baza-1)/(LL)(n-1)*(LL)suma);
	}
	if (N-1)
	{
		int n=mod(N);
		 baza=putere(n,M+1);
		if (baza-1<0)
			baza=MOD-baza;
		n=mod(N);
		suma=mod((baza-1)/(LL)(n-1)*suma);
	}
	printf("%lld ",suma);
}
inline void citire()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d%d",&N,&M);
	
	desc();
}
int main()
{
	citire();
	return 0;
}