Cod sursa(job #193638)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 5 iunie 2008 21:04:05
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include<stdio.h>
#define M 9901UL

unsigned long putere(unsigned x,unsigned e){
unsigned p=1,y=1;
while(p<=e) p*=2;
do{
	p/=2;
	y*=y;
	y%=M;
	if(e>=p){
		e-=p;
		y*=x;
		y%=M;
		}
	}while(p>1);
return y%M;
}

int main(){
freopen("sumadiv.in","r",stdin);
freopen("sumadiv.out","w",stdout);
unsigned long i,p,a,b,s,sp,d,fpa[40]={0},efpa[40]={0},nrfp;
scanf("%lu%lu",&a,&b);
nrfp=0;
if(!(a%2)){
	fpa[0]=2;
	while(!(a%2)){
		efpa[0]++;
		a/=2;
		}
	nrfp++;
	}
for(d=3;d*d<=a;d+=2)
	if(!(a%d)){
		fpa[nrfp]=d;
		while(!(a%d)){
			efpa[nrfp]++;
			a/=d;
			}
		nrfp++;
		}
if(a>1) {
	fpa[nrfp]=a;
	efpa[nrfp]=1;
	nrfp++;
	}
for(i=0;i<nrfp;++i) efpa[i]*=b;
s=1;
for(i=0;i<nrfp;++i){
	p=putere(fpa[i]%M,(efpa[i]+1)%M);
	sp=(p-1)/(fpa[i]-1);
	s=s*sp%M;
	}
printf("%lu",s%M);
return 0;
}