Cod sursa(job #193387)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 4 iunie 2008 08:14:09
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
#define N 40005
#define MOD 9901
int v[N];
long long e[N];
int A,B,n,x,y,z,i;
long long r;
long long put(int a,long long b){
	long long  i,p=a,r=1;
	for(i=0;(1<<i)<=b;++i,p=(p*p)%MOD)
		if(b&(1<<i))
			r=(r*p)%MOD;
		return r;
}
long long inv(int a){
	return put(a,MOD-2);
}
int main(){
	freopen("sumdiv.in", "r", stdin);
	freopen("sumdiv.out", "w", stdout);
	scanf("%d %d",&A,&B);
	if(A==1||B==0){
		printf("1\n");
		return 0;
	}   
    x=A;n=0;
	for(i=2;i*i<=A&&x>1;++i){
		if(x%i)
			continue;
		for(v[n]=i,e[n]=0;x%i==0;x/=i,e[n]++);
		e[n]*=B;
		++n;
	}
	if(x>1)
		v[n]=x,e[n++]=B;
    for(r=1,i=0;i<n;++i){   
        if((v[i]%MOD)==1){   
            r=(r*(e[i]+1))%MOD;   
            continue;
		}
		x=put(v[i],e[i]+1)-1;
		x+=x<0?MOD:0;
		y=(v[i]-1)%MOD;
		z=(inv(y)*x)%MOD;
		r=(r*z)%MOD;
	}
    printf("%lld\n",r);
	return 0;   
}