Cod sursa(job #2883147)

Utilizator AndreiAlexandru2k3Ciucan Andrei Alexandru AndreiAlexandru2k3 Data 1 aprilie 2022 10:57:01
Problema Suma divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int MOD = 9901;
int a, b, ans = 1;

int lgput(int x, int n)
{
    int val = 1;
    while(n)
    {
        if(n & 1)
            val = 1LL * val * x % MOD;
        x = 1LL * x * x % MOD;
        n >>= 1;
    }
    return val;
}

inline invers_modular(int x)
{
    return lgput(x, MOD - 2);
}

void desc()
{
    if(a % 2 == 0)
    {
        int exp = 0;
        do
        {
            exp++;
            a /= 2;
        }
        while(a % 2 == 0);
        exp *= b; ///exp e maxim 25
        ans = 1LL * ans * (lgput(2, exp + 1) - 1) % MOD;
        if(ans < 0)
            ans += MOD;
    }
    for(int d = 3; d * d <= a; d += 2)
        if(a % d == 0)
        {
            int exp = 0;
            do
            {
                exp++;
                a /= d;
            }
            while(a % d == 0);
            exp *= b;
            if((d - 1) % MOD == 0)
                ans = 1LL * ans * (exp + 1) % MOD;
            else
                ans = 1LL * ans * (lgput(d, exp + 1) - 1) * invers_modular(d - 1) % MOD;
            if(ans < 0)
                ans += MOD;
        }
    if(a > 1)
    {
        if((a - 1) % MOD == 0)
            ans = 1LL * ans * (b + 1) % MOD;
        else
            ans = 1LL * ans * (lgput(a, b + 1) - 1) * invers_modular(a - 1) % MOD;
        if(ans < 0)
            ans += MOD;
    }
}

int main()
{
    f >> a >> b;
    desc();
    g << ans;
    f.close();
    g.close();
    return 0;
}