Cod sursa(job #589832)

Utilizator vendettaSalajan Razvan vendetta Data 13 mai 2011 21:57:04
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
#define REST 9901
using namespace std;

int fact[1<<17],pu[1<<17],sz;

int putere(int n, int p) {
    int pp,a;
	pp=1;
	a=n%REST;
	for(;p;) {
		if(p&1) {
			pp*=(a%REST);
			pp%=REST;
		}
		a*=(a%REST);
		a%=REST;
		p>>=1;
	}
	return pp;
}

void desc(int x) {
    for(int i=2; i*i<=x; ++i) if(0==x%i)  {
        int p=0;
        for(;0==x%i; ++p,x/=i);
        ++sz;
        fact[sz]=i; pu[sz]=p;
    }
    if(1<x) {
        ++sz;
        fact[sz]=x; pu[sz]=1;
    }
}

int main()
{
    int a,b,cont=1;
    ifstream f("sumdiv.in");
    ofstream g("sumdiv.out");
    f>>a>>b;
    desc(a);
    for(int i=1; i<=sz; ++i) pu[i]*=b;
    for(int i=1; i<=sz; ++i) {
        if(0!=fact[i]%REST-1) cont*=(((putere(fact[i],pu[i]+1)-1+REST)%REST)*putere((fact[i]%REST-1+REST)%REST,REST-2))%REST;
        else cont*=((pu[i]+1)%REST);
        cont%=REST;
    }
    g<<cont;
    return 0;
}