結果

問題 No.3457 Fibo-shrink
コンテスト
ユーザー aqua
提出日時 2026-02-28 14:24:38
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 774 ms / 2,000 ms
コード長 1,886 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,751 ms
コンパイル使用メモリ 337,140 KB
実行使用メモリ 7,844 KB
最終ジャッジ日時 2026-02-28 14:24:46
合計ジャッジ時間 6,938 ms
ジャッジサーバーID
(参考情報)
judge7 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 12
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

bool chmax(auto &a, auto b) { return a < b ? a = b, 1 : 0; }
bool chmin(auto &a, auto b) { return a > b ? a = b, 1 : 0; }

template<ll MOD>
struct modint {
    using M = modint;
    ll x;
    modint() : x(0) {}
    constexpr modint(ll v) : x(v % MOD) {
        if (x < 0) x += MOD;
    }
    ll val() { return x; }
    static constexpr ll mod() noexcept { return MOD; }
    friend M operator+(M a, M b) { return a.x + b.x; }
    friend M operator-(M a, M b) { return a.x - b.x; }
    friend M operator*(M a, M b) { return a.x * b.x; }
    friend M operator/(M a, M b) { return a * b.inv(); }
    friend M operator+=(M& a, M b) { return a = a + b; }
    friend M operator-=(M& a, M b) { return a = a - b; }
    friend M operator*=(M& a, M b) { return a = a * b; }
    friend M operator/=(M& a, M b) { return a = a / b; }
    friend bool operator==(M a, M b) { return a.x == b.x; }
    friend bool operator!=(M a, M b) { return a.x != b.x; }
    M operator+() { return *this; }
    M operator-() { return M() - *this; }
    M inv() const {
        ll a = x, b = MOD;
        ll u = 1, v = 0;
        while (b > 0) {
            ll t = a / b;
            a -= t * b;
            swap(a, b);
            u -= t * v;
            swap(u, v);
        }
        return u;
    }
};

using mint = modint<10007>;

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

    int K; ll S, N; cin >> K >> S >> N;
    vector<mint> F(N + 1);
    F[0] = F[1] = 1;
    for (int i = 2; i <= N; ++i) F[i] = F[i - 1] + F[i - 2];
    vector<mint> v(N + 1);
    v[1] = S;
    for (int i = 1; i < N; ++i) {
        for (int j = max(1, i - K); j <= i; ++j) {
            v[i + 1] += v[j] * F[i - j].inv();
        }
    }
    // for (int i = 0; i <= N; ++i) cout << v[i].val() << " \n"[i == N];
    cout << v[N].val() << '\n';
}
0