Cod sursa(job #757704)

Utilizator maritimCristian Lambru maritim Data 13 iunie 2012 00:15:16
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 0.95 kb
#include<stdio.h>
#include<math.h>

FILE *f = fopen("sumdiv.in","r");
FILE *g = fopen("sumdiv.out","w");

#define Mod 9901
#define MaxFact 1000

int A,B,Sol = 1;
int Fact[MaxFact];
int Putere[MaxFact];

void citire(void)
{
	fscanf(f,"%d %d",&A,&B);
}

inline int PutLg(int baza,int exp)
{
	if(exp == 1)
		return baza;
	
	int baza1 = baza;
	baza = PutLg(baza,exp/2);
	baza = (1LL*baza*baza)%Mod;
	if(exp&1) baza = (1LL*baza*baza1)%Mod;
	
	return baza;
}

void Descompunere(void)
{
	int x = (int)sqrt(A);
	for(int i=2;i<=x && A != 1;i++)
		if(A%i == 0)
		{
			Fact[++Fact[0]] = i;
			for(;A%i == 0;Putere[Fact[0]] ++,A /= i);
		}
		
	if(A != 1)
		Fact[++Fact[0]] = A,Putere[Fact[0]] = 1;
}

inline int ValidNumar(int a)
{
	return (Mod+a)%Mod;
}

void Rezolvare(void)
{
	Descompunere();
	
	for(int i=1;i<=Fact[0];i++)
		Sol = ((1LL*Sol)*(1LL*(PutLg(Fact[i],B*Putere[i]+1)-1)*PutLg(Fact[i]-1,Mod-2))%Mod)%Mod;
}

int main()
{
	citire();
	Rezolvare();
	
	fprintf(g,"%d\n",Sol);
}