Cod sursa(job #756251)

Utilizator ms-ninjacristescu liviu ms-ninja Data 9 iunie 2012 12:51:19
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.04 kb
#include <fstream>
using namespace std;
#define dim 1001
#define mod 9901
int factor[dim], putere[dim];


int solve(int k)
{
	long long baza=factor[k];
	long long p=putere[k]+1;
	long long sol=1;
	
	
	for(;p;p>>=1)
	{
		if(p&1)
			sol=(sol*baza)%mod;
		baza=(baza*baza)%mod;
	}
	
	sol=(sol-1+mod)%mod;
	if(sol==0)
		return (putere[k]+1)%mod;
	long long aux=sol;
	
	p=mod-2;
	sol=1;
	baza=factor[k]-1;
	
	for(;p;p>>=1)
	{
		if(p&1)
			sol=(sol*baza)%mod;
		baza=(baza*baza)%mod;
	}
	
	
	return (aux*sol)%mod;
}

int main()
{
	ifstream fin("sumdiv.in");
	ofstream fout("sumdiv.out");
	int a, b, aux, nr=0,i;
	fin>>a >>b;
	
	if(b==0)
		{fout<<"1";return 0;}
	
	if(a==0)
	{
		fout<<"0";
		return 0;
	}
	aux=a;
	
	for(i=2;i*i<=a;++i)
		if(aux%i==0)
		{
			factor[++nr]=i;
			while(aux%i==0)
			{
				++putere[nr];
				aux/=i;
			}
			putere[nr]*=b;
		}
	if(aux!=1)
	{
		factor[++nr]=aux;
		putere[nr]=b;
	}
	
	int s=1;
	for(i=1;i<=nr;++i)
		s=(s*solve(i))%mod;
		
	fout<<s;
		
	return 0;
}