Cod sursa(job #687160)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 22 februarie 2012 10:00:40
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<fstream>
#define lim 100001
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
long long A,B,nr,v[lim+1],prim[10001];
void ciur (){
	prim[1]=2;
	prim[-1]=1;
	for(int i=3;i<=lim;i+=2)
		if(v[i]==0){
			prim[++prim[-1]]=i;
			for(int j=i+i;j<=lim;j+=i)
				v[j]=i;
		}
}
long long  ridicare(long long  n,long long  p){
	long long r=1;
	while(p!=0){
		if(p%2==1)
			r=(r*n)%9901;
		n=(n*n)%9901;
		p/=2;
	}
	return r;
}
void determinare(long long r){
	long long ndiv, suma, t, i, ex;
	ndiv=suma=1;
	for(i=1;prim[i]*prim[i]<=r;i++){
		if(r%prim[i]==0){
			ex=1;
		    t=prim[i];
			while(r%prim[i]==0){
				t=t*prim[i];
				ex++;
				r/=prim[i];
			}
			ndiv*= ex;
			suma*=(t-1)/(prim[i]-1)%9901;
		}
	}
	if(r!=1){
		suma*=(r*r-1)/(r-1)%9901;
		ndiv*=2;
	}
	g<<suma%9901<<"\n";
}
int main (){
	f>>A>>B;
	ciur();
	nr=ridicare(A,B);
	determinare(nr);
	return 0;
}