Cod sursa(job #1112278)

Utilizator EpictetStamatin Cristian Epictet Data 19 februarie 2014 17:24:11
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <fstream>
#define MOD 9901
#define LL long long
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
LL a,b,k,d,e[50],p[50];

LL puteri(LL a, LL k)
{
    LL val = 1;
    while(k > 0)
    {
        if(k & 1) val = val * a;
        a = a * a;
        k = k / 2;
    }
    return val;
}

int main()
{
    f >> a >> b;
    if(a == 0) g << "0\n";
    else if((a == 1)||(b == 0)) g << "1\n";
    else
    {
        d = 2;
        while(d * d <= a)
        {
            e[++k] = 0;
            p[k] = d;
            while(a % d == 0)
            {
                e[k]++;
                a/=d;
            }
            d++;
        }
        if(a > 1) e[++k] = 1, p[k] = a;
        int s = 1;
        for(int i=1; i<=k; i++)
            s = s * (puteri(p[i], e[i]*b+1)-1) / (p[i]-1) % MOD;

        g << s << '\n';
    }
    g.close();
    return 0;
}