62392023-11-08 12:46:21Error42Tömbök előállításacpp17Időlimit túllépés 60/1002.049s5556 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;

            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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1828 KiB
2Elfogadva3ms2028 KiB
3Elfogadva3ms2240 KiB
subtask210/10
4Elfogadva3ms2456 KiB
5Elfogadva2ms2552 KiB
6Elfogadva3ms2648 KiB
subtask310/10
7Elfogadva2ms2548 KiB
8Elfogadva3ms2660 KiB
9Elfogadva3ms2784 KiB
10Elfogadva3ms2920 KiB
11Elfogadva3ms3132 KiB
12Elfogadva3ms3240 KiB
13Elfogadva3ms3452 KiB
subtask47/7
14Elfogadva3ms3540 KiB
15Elfogadva3ms3592 KiB
16Elfogadva3ms3796 KiB
17Elfogadva3ms4012 KiB
18Elfogadva3ms4248 KiB
19Elfogadva3ms4208 KiB
20Elfogadva3ms4208 KiB
subtask58/8
21Elfogadva79ms4224 KiB
22Elfogadva39ms4344 KiB
23Elfogadva50ms4560 KiB
24Elfogadva32ms4652 KiB
25Elfogadva17ms4740 KiB
26Elfogadva8ms4868 KiB
27Elfogadva57ms4964 KiB
28Elfogadva12ms4964 KiB
29Elfogadva79ms5068 KiB
30Elfogadva79ms5200 KiB
subtask625/25
31Elfogadva17ms5276 KiB
32Elfogadva17ms5308 KiB
33Elfogadva8ms5332 KiB
34Elfogadva8ms5316 KiB
35Elfogadva6ms5324 KiB
36Elfogadva8ms5556 KiB
37Elfogadva3ms5420 KiB
38Elfogadva3ms5420 KiB
39Elfogadva10ms5428 KiB
40Elfogadva13ms5432 KiB
subtask70/40
41Elfogadva592ms5448 KiB
42Elfogadva1.904s5544 KiB
43Időlimit túllépés2.026s5296 KiB
44Időlimit túllépés2.049s5352 KiB
45Időlimit túllépés2.046s5432 KiB
46Elfogadva554ms5460 KiB
47Elfogadva888ms5388 KiB
48Elfogadva12ms5368 KiB
49Elfogadva1.465s5492 KiB
50Elfogadva683ms5464 KiB