Cod sursa(job #969460)

Utilizator predatorGigi Valoare predator Data 4 iulie 2013 13:49:56
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<fstream>
#define mod 9901
#define ll long long
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
long long b,S,put,j,ex,x,y,a;
void inv_mod(ll &x,ll &y,ll a,ll b);
void exp(long long x,long long p);
int main ()
{
	f>>a>>b;
	S=1;
	if(a%2==0)
	{
	while(a%2==0)
	{
		a>>=1;
		ex++;
	}
	put=ex*b;
	exp(2,put+1);
	}
	for(j=3;j*j<=a;j+=2)
	{
		if(a%j==0)
		{
			put=ex=0;
			while(a%j==0)
			{
				a/=j;
				ex++;
			}
			put=ex*b;
			inv_mod(x,y,j-1,mod);
			while(x<=0)
				x+=mod;
			S*=x;
			S%=mod;
			exp(j,put+1);
		}
	}
	if(a!=1)
	{
		inv_mod(x,y,a-1,mod);
		while(x<=0)
			x+=mod;
		S*=x;
		S%=mod;
		exp(a,b+1);
	}
	g<<S;
	return 0;
}
void inv_mod(ll &x,ll &y,ll a,ll b)
{
    if(!b) {x=1; y=0;}
    else
    {
        inv_mod(x,y,b,a%b);
        ll x0,y0;
        x0=x;y0=y;
        x=y;
        y=x0-a/b*y0;
    }
}
void exp(long long x,long long p)
{
	long long sol;
	sol=1;
	while(p)
	{
		if(p&1)
		{
			sol*=x;
			sol%=mod;
		}
		p>>=1;
		x*=x;
		x%=mod;
	}
	sol--;
	if(sol<0)
		sol+=mod;
	S*=sol;
	S%=mod;
}