Cod sursa(job #434319)

Utilizator ooctavTuchila Octavian ooctav Data 5 aprilie 2010 17:07:51
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 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 , p--;
		a = (a * a) % MOD;
	}
	return rez;
}

void rezolva()
{
	long long n = A;
	long long S = 1;
	for(long long i = 2 ; i * i <= A ; i++)
		if(n % i == 0)
		{
			int exp = 0;
			while(n % i == 0)
			{
				n /= i;
				exp++;
			}
			if (n % 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(n > 1)
		if (n % MOD == 1)
            S = (S * (B + 1)) % MOD;
		else
			S = ((S * (pw(n, B + 1) + MOD - 1) % MOD) * pw(n - 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;
}