Cod sursa(job #3225802)

Utilizator deerMohanu Dominic deer Data 18 aprilie 2024 22:29:41
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
///#include <ext/pb_ds/assoc_container.hpp>
#define fi first
#define se second
#define int unsigned long long
#define sz(a) int((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))

#define YES { fout << "DA" << endl; return; }
#define NO { fout << "NU" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;
const int MOD = 1e9 + 7;
using namespace std;
///using namespace __gnu_pbds;
ifstream fin ("sumdiv.in");
ofstream fout ("sumdiv.out");
int A, B, ans = 1;
int lgpow(int base, int exp) {
    int ans = 1;
    while (exp) {
        if (exp & 1)
            ans = (ans * base) % MOD;
        base = (base * base) % MOD;
        exp >>= 1;
    }
    return ans;
}
signed main() {
    fin >> A >> B;
    for (int i = 2; i <= A; ++i) {
        if (i * i > A)
            i = A;
        if (A % i)continue;
//        cout << i << " ";
        int cnt = 0;
        while (A % i == 0) {
            ++cnt;
            A /= i;
        }
//        cout << cnt;
        cnt *= B;
        int p1 = (lgpow(i, cnt + 1) - 1 + MOD) % MOD;
        int p2 = lgpow(i - 1, MOD - 2) % MOD;
        cout << p2 << " " ;
        if (i % MOD == 1)
            p1 = 1, p2 = (B + 1) % MOD;
        ans = (((ans * p1) % MOD) * p2) % MOD;
    }
    cout << (lgpow(2, 39 * B + 1)  - 1) % MOD << " ";
    cout << LONG_LONG_MAX;
    fout << ans;
    return 0;
}