Cod sursa(job #757492)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 12 iunie 2012 12:08:51
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<iostream>
#include<fstream>
#include<math.h>

using namespace std;

#define MOD 9901 

int k,a,b,v[1000],nr[1000],sum,s[1000];



void afisare()
{
	ofstream f("sumdiv.out");
	f<<sum; 
	f.close();
}



int exponent (int x, int nr )
{ 
	if (nr==0 ) return 1 ;
	int a=exponent (x,nr/2);
	a*=a;
	if (nr%2==0) return a% MOD; 
		else return (a*x)%MOD ; 
}

void solve()
{
	int i,j,sumi;
	
	s[0]=1; sum=1;
	
	for (i=1;i<=k;i++) {
		v[i]%=MOD;
		sumi=((exponent(v[i],nr[i]*b+1)-v[i])%MOD )*exponent (v[i]-1,MOD-2)% MOD;
		s[i]=(sum*sumi)%MOD; 
		sum+=s[i]; sum%=MOD;
	}
}

void divizori ()
{
	int i ,x;
	
	x=a; k=0; 
	for (i=2;i<=sqrt(a) && x>1; ++i )  {
		if (x%i==0) { 
			k++;  v[k]=i;
			for (;x%i==0; x/=i,nr[k]++ ) ;
		}
	}
	
	if (x >1 ) { v[++k]=x; nr[k]=1; }
}

int main()
{
	ifstream f("sumdiv.in"); 
	f>>a>>b ; 
	f.close();
	divizori ();
	solve();
	afisare();
	return 0;
}