Cod sursa(job #3149923)

Utilizator alex210046Bratu Alexandru alex210046 Data 13 septembrie 2023 17:25:21
Problema Suma divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
const int NMAX = 50000000;
const int MOD = 9901;
bool prim[8000];
long long a, b;
vector<int> ciur;

void eratostene() {
    prim[0] = prim[1] = 1;
    for(int d = 2; d * d <= NMAX; d++)
        if(!prim[d]) {
            for(int j = d * 2; j * j <= NMAX; j += d)
                prim[j] = 1;
            ciur.push_back(d);
        }
}

int lgPow(long long x, long long p) {
    long long v = 1;
    while(p > 0) {
        if(p & 1)
            v = 1LL *  v * x % MOD;
        x = 1LL * x * x % MOD;
        p >>= 1;
    }
    return v;
}

inline int invMod(long long n) {
    return lgPow(n, MOD - 2);
}

void desc(long long x) {
    long long s = 1;
    for(int d : ciur)
        if(x % d == 0) {
            if(1LL * d * d > x) break;
            long long p = 0;
            while (x % d == 0) {
                p++; x /= d;
            }
            p *= b;
            s = (1LL * s * (lgPow(d, p + 1) - 1) % MOD) * invMod(d - 1) % MOD;
        }
    if (x > 1)
        s = (1LL * s * (lgPow(x, b + 1) - 1) % MOD) * invMod(x - 1) % MOD;
    g << s;
}

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

    return 0;
}