Cod sursa(job #530185)

Utilizator ioanabIoana Bica ioanab Data 7 februarie 2011 09:43:16
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
using namespace std;


const int N=100005;
const int m=9901;
bool c[N];
int v[N];
int inv[N];

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

void ciur()

{
	int i,j,n;
	for(i=2;i*i<N;++i)
		if(!c[i])
			for(j=i*i;j<N;j+=i)
				c[j]=true;
	n=0;
	for(i=2;i<N;i++)
		if(c[i]==false)
			v[++n]=i;
}

long long Fast_pow(long long a, long long b)
{
	long long p;
	if(b==0)
		return 1;
	if(b==1)
		return a%m;
	p=Fast_pow(a%m,b/2);
	if(b%2==0)
		return (p%m * p%m) %m;
	if(b%2==1)
		return ((p%m * p%m)%m*a%m)%m;
	return 0;

}

int invers(int x)
{
	int i;
	for(i=1;i<m;i++)
		if((i*x)%m==1)
		{
			inv[i]=x;
			inv[x]=i;
			return i;
		}
	return 0;
}

int main()
{
	
	long long i,p,j;
	long long suma,a,b,x;
	ciur();
	in>>a>>b;
	suma=1;
	
		
	for(i=1;v[i]*v[i]<=a;++i)
		if(a%v[i]==0)
		{
				p=0;
				while(a%v[i]==0)
				{
					++p;
					a/=v[i];
				}
				x=p*b+1;
				if(v[i]%m==0)
					j=v[i]+m-1;
				else
					j=(v[i]-1)%m;
				
				if(v[i]%m==1)
					suma=(suma*x)%m;
				else
				{
					if(inv[j]==0)
						invers(j);
					suma=suma*((Fast_pow(v[i],x)+m-1)%m)*inv[j];
					suma=suma%m;
				}
				
		}
	
		if(a!=1)
		{
			x=b+1;
			if(a%m==0)
				j=a+m-1;
			else
				j=a-1;
			if(a%m==1)
				suma=(suma*x)%m;
			else
			{
				if(inv[j]==0)
					invers(j);
				suma=suma*(Fast_pow(a,x)-1)*(inv[j]);
				suma=suma%m;
			}
		}
		out<<suma;

	return 0;
}