Cod sursa(job #3316535)

Utilizator gicaviitorulgica viitorul gicaviitorul Data 19 octombrie 2025 08:52:14
Problema Suma divizorilor Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ll long long
#define xx first
#define yy second
#define all (x) begin(x), end(x)
#define MOD 9901
using pii = pair <int, int>;
using tii = tuple <int, int, int>;


#define cin fin 
#define cout fout 

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



int n;
constexpr int NMAX = (int) 1e6;
bool ciur[NMAX + 1];
vector <int> v;
int k;
inline void eratostene()
{
    ciur[0] = ciur[1] = 1;
    for (int i = 2; i * i <= NMAX; ++ i)
    {
        if (!ciur[i])
            for (int j = i * i; j <= NMAX; j += i)
                ciur[j] = 1;
    }
    for (int i = 2; i <= NMAX; ++ i)
    {
        if (!ciur[i])   
           v.push_back(i);
    }
}


inline int lgput(int a, int b)
{
    int p = 1;
    while (b)
    {
        if (b & 1)
        {
            p *= a;
        }
        a *= a;
        b >>= 1;
    }
    return p;
}
inline int inversModular(int x)
{
    return lgput(x, MOD - 2);
}
inline void solutie (int x)
{
    int idx = 0;
    int p = 1, suma = 1;
    while (idx < v.size() && v[idx] * v[idx] <= x)
    {
        int trala = v[idx];
        int sigma = 0;
        while (x % trala == 0)
        {
            sigma ++;
            x /= trala;
        }
        if (sigma)
        {
            p *= (sigma + 1);
            suma *= ((lgput(trala, (sigma + 1)) - 1)%MOD*inversModular(trala - 1)%MOD);
            //suma %= MOD;
        }
        idx ++;
    }
     if (x != 1)
        {
            int d = x, sigma = 1;
            if (sigma){
            p *= (sigma + 1);
            suma *= ((lgput(d, (sigma + 1)) - 1) %MOD*inversModular(d - 1)%MOD);
            suma %= MOD;
            }
        }
    cout << suma << '\n';
}
signed main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> k;
     eratostene();
     solutie(lgput(n, k));
    return 0;
}