Cod sursa(job #434326)

Utilizator ooctavTuchila Octavian ooctav Data 5 aprilie 2010 17:16:14
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <cstdio>
const int MOD = 9901;
long long A, B;

long long pw(long long a, long long p)
{
	long long rez = 1;
	a = a % MOD;
	for(; p ; p = p>>1)
	{
		if(p & 1)
			rez = (rez * a) % MOD;
		a = (a * a) % MOD;
	}
	return rez;
}

void rezolva()
{
	long long S = 1;
	for(long long i = 2 ; i * i <= A ; i++)
		if(A % i == 0)
		{
			int exp = 0;
			while(A % i == 0)
			{
				A /= i;
				exp++;
			}
			if (i % MOD == 1)
				S = (S * (exp * B + 1)) % MOD;
			else
				S = ((S * pw(i, B * exp + 1) + MOD - 1) % MOD * pw(i - 1, MOD - 2)) % MOD;
		}
	if(A > 1)
		if (A % MOD == 1)
            S = (S * (B + 1)) % MOD;
		else
			S = ((S * (pw(A, B + 1) + MOD - 1) % MOD) * pw(A - 1, MOD - 2)) % MOD;
		
	printf("%lld", S);
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%lld%lld",&A,&B);
	rezolva();
	
	return 0;
}