Cod sursa(job #933514)

Utilizator NicuCJNicu B. NicuCJ Data 30 martie 2013 00:52:54
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <fstream>
#include <algorithm>
#define mod 9901
using namespace std;

long long putere(long long bz, long long xp)
{
	if(xp==0)
		return 1;
	if(bz%9901==0 || bz%mod==1)
		return (xp+1)%9901;
	else if(xp%2) return (((bz%mod*(putere(bz, xp/2)%mod))%mod)*(putere(bz, xp/2)%mod))%mod;
	return (((putere(bz, xp/2))%mod)*(putere(bz, xp/2)%mod))%mod;
}
long long a, b, aux, phi, i, pr[100001], ex[100001];
long long rez, k;
int main()
{
	ifstream f("sumdiv.in");
	ofstream g("sumdiv.out");
	f>>a>>b;
	phi=mod-1;
	for(i=2; i*i<=a; i++)
	{
		if(a%i==0)
		{
			k++;
			pr[k]=i;
			while(a%i==0)
			{
				ex[k]++;
				a/=i;
			}
		}
	}
	if(a!=1)
	{
		if(!binary_search(pr+1, pr+k+1, a))
		{
			k++;
			pr[k]=a;
			ex[k]++;
		}
		else ex[lower_bound(pr+1, pr+k+1, a)-pr]++;
	}
	rez=1;
	for(i=1; i<=k; i++)
	{
		ex[i]*=b;
		//ex[i]%=mod;
		long long act=((putere(pr[i], ex[i]+1))-1)%mod;
		long long act2=(putere(pr[i]-1, phi-1)%mod);
		rez=(rez*((act*act2)%mod))%mod;
		if(rez<0)
			rez+=mod;
	}
	if(rez<0)
		rez+=mod;
	g<<rez;
}