Cod sursa(job #554207)

Utilizator S7012MYPetru Trimbitas S7012MY Data 14 martie 2011 17:58:16
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>
#define REST 9901
using namespace std;

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

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

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;
}