6240 2023. 11. 08 12:47:28 Error42 Tömbök előállítása cpp17 Elfogadva 100/100 967ms 5084 KiB
#include <iostream>
#include <vector>

using namespace std;

using ll = long long;

template <ll M>
struct modular {
    ll val;

    // n >= 0
    modular(const ll n) {
        if (n < M)
            val = n;
        else if (n < 2 * M)
            val = n - M;
        else
            val = n % M;
    }

    [[nodiscard]] modular operator +(const modular& rhs) const {
        return val + rhs.val;
    }

    [[nodiscard]] modular operator -(const modular& rhs) const {
        return val + M - rhs.val;
    }

    [[nodiscard]] modular operator *(const modular& rhs) const {
        return val * rhs.val;
    }

    // p >= 0
    [[nodiscard]] modular pow(const ll& p) const {
        if (p == 0)
            return 1;

        if (p % 2 == 0)
            return (*this * *this).pow(p / 2);
        else
            return *this * pow(p - 1);
    }

    [[nodiscard]] modular inv() const {
        return pow(M - 2);
    }

    [[nodiscard]] modular operator /(const modular& rhs) const {
        return *this * rhs.inv();
    }

    modular& operator +=(const modular& rhs) {
        return *this = *this + rhs;
    }

    modular& operator -=(const modular& rhs) {
        return *this = *this - rhs;
    }

    modular& operator *=(const modular& rhs) {
        return *this = *this * rhs;
    }

    modular& operator /=(const modular& rhs) {
        return *this = *this / rhs;
    }

    explicit operator ll() const {
        return val;
    }
};

template <ll M>
ostream& operator<<(ostream& os, const modular<M>& modular) {
    cout << modular.val;
    return os;
}

using mod = modular<1'000'000'007>;

ll n, m, l, r, k;

vector<mod> identity;

vector<mod> combine(vector<mod> const& a, vector<mod> const& b) {
    vector<mod> ret(m, 0);
    
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < m; j++) {
            int k = i + j >= m ? i + j - m : i + j;

            ret[k] += a[i] * b[j];
        }
    }

    return ret;
}

vector<mod> calc(ll const n) {
    if (n == 1)
        return identity;
    else if (n % 2 == 1)
        return combine(calc(n - 1), identity);
    else {
        auto const half = calc(n / 2);
        return combine(half, half);
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m >> l >> r >> k;

    identity.assign(m, 0);

    for (int i = 0; i < m; i++) {
        identity[i] += (r - i + m) / m;
        identity[i] -= (l - 1 - i + m) / m;
    }

    auto const ans = calc(n);

    cout << ans[k] << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1704 KiB
2 Elfogadva 3ms 1864 KiB
3 Elfogadva 3ms 2088 KiB
subtask2 10/10
4 Elfogadva 3ms 2300 KiB
5 Elfogadva 3ms 2500 KiB
6 Elfogadva 3ms 2708 KiB
subtask3 10/10
7 Elfogadva 2ms 2816 KiB
8 Elfogadva 3ms 2920 KiB
9 Elfogadva 3ms 2944 KiB
10 Elfogadva 2ms 3008 KiB
11 Elfogadva 2ms 3112 KiB
12 Elfogadva 2ms 3108 KiB
13 Elfogadva 2ms 3104 KiB
subtask4 7/7
14 Elfogadva 3ms 3136 KiB
15 Elfogadva 3ms 3328 KiB
16 Elfogadva 2ms 3412 KiB
17 Elfogadva 2ms 3408 KiB
18 Elfogadva 2ms 3520 KiB
19 Elfogadva 3ms 3736 KiB
20 Elfogadva 3ms 3960 KiB
subtask5 8/8
21 Elfogadva 35ms 4192 KiB
22 Elfogadva 17ms 4080 KiB
23 Elfogadva 23ms 4212 KiB
24 Elfogadva 14ms 4064 KiB
25 Elfogadva 8ms 4152 KiB
26 Elfogadva 4ms 4156 KiB
27 Elfogadva 25ms 4160 KiB
28 Elfogadva 4ms 4284 KiB
29 Elfogadva 35ms 4376 KiB
30 Elfogadva 35ms 4276 KiB
subtask6 25/25
31 Elfogadva 6ms 4472 KiB
32 Elfogadva 6ms 4472 KiB
33 Elfogadva 4ms 4472 KiB
34 Elfogadva 4ms 4572 KiB
35 Elfogadva 4ms 4568 KiB
36 Elfogadva 4ms 4472 KiB
37 Elfogadva 3ms 4476 KiB
38 Elfogadva 3ms 4484 KiB
39 Elfogadva 4ms 4484 KiB
40 Elfogadva 7ms 4612 KiB
subtask7 40/40
41 Elfogadva 268ms 4708 KiB
42 Elfogadva 855ms 5000 KiB
43 Elfogadva 967ms 5008 KiB
44 Elfogadva 961ms 5008 KiB
45 Elfogadva 930ms 5008 KiB
46 Elfogadva 250ms 4944 KiB
47 Elfogadva 393ms 4940 KiB
48 Elfogadva 4ms 5000 KiB
49 Elfogadva 661ms 5084 KiB
50 Elfogadva 305ms 4992 KiB