Cod sursa(job #757453)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 12 iunie 2012 08:56:09
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#define MOD 9901
#define NMAx 7075
using namespace std;

int A,B,Sol=1,Nr,Prim[NMAx];
bool Viz[NMAx];

int exp_log(int A,int P) {
	
	int Step=1,Rez=1;
	
	while(Step<=P) {
		
		if(Step&P)
			Rez=(Rez*A)%MOD;
			
		A=(A*A)%MOD;
		Step<<=1;
		}
	
	return Rez;
	
}
void Solve() {
	
	int i,K,X,Y;
	
	if(A==0)
		{Sol=0;return;}
	
	for(i=1;(A>1&&Prim[i]*Prim[i]<=A);i++)
		if(A%Prim[i]==0) {
			
			for(K=0;A%Prim[i]==0;K++,A/=Prim[i]);
			
			X=exp_log(Prim[i],B*K+1)-1;
			Y=exp_log(Prim[i]-1,MOD-2);
			
			Sol=(Sol*((X*Y)%MOD))%MOD;
			
			}
		
	if(A>1) {
		
		X=exp_log(A,B+1)-1;
		Y=exp_log(A-1,MOD-2);
		
		Sol=(Sol*((X*Y)%MOD))%MOD;
		
		}
	
}
void Ciur() {
	
	int i,j;
	
	Prim[++Nr]=2;
	
	for(i=3;i<NMAx;i+=2)
		if(!Viz[i]) {
			Prim[++Nr]=i;
			
			for(j=i;j<NMAx;j+=i)
				Viz[j]=1;
			}
	
}
void Citire() {
	
	ifstream in("sumdiv.in");
	in>>A>>B;
	in.close();
	
}
void Afis() {
	
	ofstream out("sumdiv.out");
	out<<Sol<<'\n';
	out.close();
	
}
int main() {
	
	Citire();
	Ciur();
	Solve();
	Afis();
	
	return 0;
	
}