Cod sursa(job #530219)

Utilizator mihai995mihai995 mihai995 Data 7 februarie 2011 11:23:16
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <fstream>
using namespace std;

int S=1,n,b;
const int mod=9901;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");

void euclid(int a,int b,int &x,int &y,int &d)
{
	if (!b)
	{
		x=1;y=0;d=a;
		return;
	}
	int x1,y1;
	euclid(b,a%b,x1,y1,d);
	x=y1;
	y=x1-a/b*y1;
}

inline int inv(int a,int n)
{
	int x,y,d;
	euclid(a,n,x,y,d);
	while (x<0)
		x+=n;
	return x;
}

inline int pow(int x,int n)
{
	if (!n)
		return 1;
	if (n==1)
		return x%mod;
	return pow(x*x%mod,n>>1)*pow(x,n&1)%mod;
}

inline void add(int x,int n)
{
	S=S*(pow(x,n+1)+mod-1)%mod*inv(x-1,mod)%mod;
}

int main()
{
	int i,p;
	in>>n>>b;
	for (i=2;i*i<=n;i++)
		if (n%i==0)
		{
			for (p=0;n%i==0;p++,n/=i);
			add(i,b*p);
		}
	if (n!=1)
		add(n,b);
	out<<S<<"\n";
	return 0;
}