Cod sursa(job #933115)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 29 martie 2013 17:08:20
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <bitset>
using namespace std;

ifstream f("sumdiv.in"); ofstream g("sumdiv.out");

const int nmod = 9901;

bitset <8000> ciur;
int prim[8000];
int a, b, s, at, p, ss, sumMult;
int i, j, n, m, t;

void gcd (int a, int b, int &x, int &y){
	if (b==0){
		x=1; y=0;
	}
	else {
		int x0, y0;
		gcd (b, a%b, x0, y0);
		x = y0;
		y = x0 - (a/b)*y0;
	}
}

int pow (int x, int y){
	if (y==1) return x % nmod;
	
	int p = pow (x, y/2);
	if (y%2) return x*p*p % nmod;
	else return p*p % nmod;
}

int main(){
	
	prim[++t]=2;
	for (i=3; i<=8000; i+=2){
		if (ciur[i]==0){
			prim[++t]=i;
			for (j=i*i; j<=8000; j+=i*2) ciur[j]=1;
		}
	}
	
	f>>a>>b;
	s=1;
	at=a;
	while (a!=1){
		for (m=1; prim[m]*prim[m]<=a && a%prim[m]; m++);
		
		if (prim[m]*prim[m]>a){
			s = s * ((a*a-1) / (a-1)) % nmod;
			a=1;
		}
		else {
			p=prim[m];
			while (a%prim[m]==0){
				p*=prim[m];
				a/=prim[m];
			}
			s = s * ((p-1) / (prim[m]-1) ) % nmod;
		}
	}
	a=at;
	
	ss = pow (a, b+1); // 
	
	int t1, inv;
	gcd ((a-1), nmod, inv, t1);
	
	sumMult = ((ss-1) * inv ) - a - 1;
	
	s = (s + sumMult);
	
	while (s<0) s+= nmod;
	s%= nmod;
	
	g<<s;
	
}