Cod sursa(job #3316534)

Utilizator marinaluca2008Marina Luca Stefan marinaluca2008 Data 19 octombrie 2025 08:45:04
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 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;
    a %= MOD;
    while (b)
    {
        if (b & 1)
        {
            p *= a;
            p %= MOD;
        }
        a *= a;
        a %= MOD;
        b >>= 1;
    }
    return p;
}

int altfel (int p ,int e)
{
    if (e == 0)
        return 1;
    if (!(e & 1))
        return (altfel (p, e / 2) *  (1 + lgput(p, e / 2 + 1))) % MOD;
    else
        return (altfel(p, e - 1) + lgput(p, e)) % MOD;
}
inline int solutie (int a, int b)
{
   int ans = 1;
   for (auto elem : v)
   {
       if (a % elem == 0)
       {
           int sigma = 0;
           while (a % elem == 0)
           {
               a /= elem;
               sigma ++;
           }
           ans *= (altfel (elem, sigma * b));
       }
   }
   if (a > 1)
    ans = (ans * altfel(a,b)) % MOD;
    return ans;
}
signed main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> k;
     eratostene();
     cout << solutie(n, k) % MOD;
    return 0;
}