Cod sursa(job #306683)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 aprilie 2009 19:52:01
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>

using namespace std;

#define file_in "sumdiv.in"
#define file_out "sumdiv.out"
#define Nmax 1010
#define prim 9901
#define ll long long
#define ii inline

ll x,y;
ll a[Nmax];
ll b[Nmax];
ll sol,nr=0,p,xx;



ii ll put(ll a, ll b)
{
	ll x;
	if (b==1)
		return a; 
	else
	if (b%2==0)
   	{
		x=put(a,b/2);
		return (x*x)%prim;
	}
	else
	{
		x=put(a,b/2);
		return (((x*x)%prim)*a)%prim;
	}
}

ii void div()
{
	ll i;
    for (i=2;i*i<=x;++i)
	{
		if (x%i==0)
		{
			continue;
		}
		nr++;
		a[nr]=i;
		while(x%i==0)
		{
			x/=i;
			++b[nr];
		}
	}
	if (x!=1)
	{
		nr++;
		a[nr]=x;
		b[nr]=1;
	}
}

	
	
ii void citire()
{
	//freopen(file_in,"r",stdin);
	//freopen(file_out,"w",stdout);
	
	scanf("%lld %lld", &x,&y);
}

ii void solve()
{
	ll i;
	div();
	sol=1;
	for (i=1;i<=nr;++i)
	{
		b[i]=b[i]*y;
		if (a[i]%prim==1)
		{
			p=b[i]+1;
		}
		else
		{
			p=(put(a[i],b[i])*a[i]+prim-1)%prim;
			p=(p*put(a[i]-1,prim-2)%prim)%prim;
		}
		sol=(sol*p)%prim;
	}
}

ii void scrie()
{
	printf("%lld", sol);
}

int main()
{
	citire();
	if (y==0) printf("1");
	else
	{
	solve();
	scrie();
	}
		
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}