Cod sursa(job #2877979)

Utilizator StefanSanStanescu Stefan StefanSan Data 25 martie 2022 17:42:06
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>

using namespace std;

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

const int MOD = 9901;

int powlg(int x, int m, int mod){
        int val = 1;
        while(m > 0) {
                if(m & 1)
                        val = 1LL * val * x % mod;
                x = 1LL * x * x % mod;
                m >>= 1;
        }
        return val;
}

inline int inv(int n){
        return powlg(n, MOD - 2, MOD);
}

int main(){

        int a, b, p = 1;
        in >> a >> b;
        if(a % 2 == 0) {
                int ex = 0;
                while(a % 2 == 0) {
                        ex++;
                        a /= 2;
                }
                ex *= b;
                p = (p * (powlg(2, ex + 1, MOD) - 1) % MOD) % MOD;
                if(p < 0)
                        p += MOD;
        }

        for(int i = 3; i * i <= a; i += 2) {
                if(a % i == 0) {
                        int ex = 0;
                        while(a % i == 0) {
                                ex++;
                                a /= i;
                        }

                        ex *= b;

                        if(i % MOD == 1) {
                                p = (1LL * p * (ex + 1)) % MOD;
                        }else
                                p = ((p * (powlg(i, ex + 1, MOD) - 1) % MOD) % MOD * inv(i - 1)) % MOD;

                        if(p < 0)
                                p += MOD;

                }
        }
        if(a > 1) {
                if(a % MOD == 1) {
                        p = (1LL * p * (b + 1)) % MOD;
                }else
                        p = ((p * (powlg(a, b + 1, MOD) - 1) % MOD) % MOD * inv(a - 1)) % MOD;
        }


        if(p < 0)
                out << p + MOD;
        else
                out << p;

        return 0;
}

// 5531