Cod sursa(job #804850)

Utilizator icb_mnStf Cic icb_mn Data 30 octombrie 2012 16:03:57
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<fstream>
#define LL unsigned long long
#define M 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

LL a, b, p[31], d[31], k;

inline LL put(LL n, LL p)
{
    LL val = 1;
    for(LL i = p; i; i>>=1)
    {
        if(i & 1) val = (val * n ) % M;
        n = (n * n) % M;
    }
    return val;
}

int main()
{
    f>>a>>b;

    LL i = 2;
    while(i * i <= a)
    {
        if(a % i == 0)
        {
            p[++k] = i;
            d[k] = 0;
            while(a % i == 0)
            {
                d[k]++;
                a /= i;
            }
            d[k] *= b;
        }
        ++i;
    }
    if(a > 1)
    {
        p[++k] = a;
        d[k] = b;
    }
    LL div = 1;

    for(int i = 1; i <= k; ++i)
    {
        LL val = put(p[i], d[i] + 1) - 1;
        LL inv = put(p[i] - 1, 9899);

        div = (div * val * inv) % M;
    }

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