Cod sursa(job #306698)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 aprilie 2009 20:10:19
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>

#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 x, ll y) 
{
    ll p=1,k;
    for (k=y;k>0;k>>=1) 
	{
        if (k%2==1) 
		    p=(p*x)%prim;
        x=(x*x)%prim;
    }
    return p;
}



ii void div()
{
	ll i;
    for (i=2;i*i<=x;++i)
	{
		if (x%i==0)
		{
		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();
	solve();
	scrie();


	fclose(stdin);
	fclose(stdout);

	return 0;
}