結果

問題 No.3457 Fibo-shrink
コンテスト
ユーザー くらげ
提出日時 2026-02-19 11:37:53
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 367 ms / 2,000 ms
コード長 2,267 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,049 ms
コンパイル使用メモリ 215,960 KB
実行使用メモリ 7,844 KB
最終ジャッジ日時 2026-02-28 13:08:11
合計ジャッジ時間 4,310 ms
ジャッジサーバーID
(参考情報)
judge7 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 12
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i) = 0; i<(n); i++)

template<ll mod> struct modint{
    public:
    ll x;
    modint(ll x=0) : x((x%mod+mod)%mod) {}
    modint operator-() const { return modint(-x); }
    modint& operator+=(const modint& a){
        if(mod<=(x += a.x)) x-=mod;
        return *this;
    }
    modint& operator-=(const modint& a){
        if(mod<=(x+=mod-a.x)) x-=mod;
        return *this;
    }
    modint& operator*=(const modint& a){
        (x*=a.x)%=mod;
        return *this;
    }
    modint& operator++(){
        ++x;
        return *this;
    }
    modint operator++(int){
        modint temp = *this;
        x++;
        return temp;
    }
    modint& operator--(){
        --x;
        return *this;
    }
    modint operator--(int){
        modint temp = *this;
        x--;
        return temp;
    }
    modint pow(ll t) const{
        modint a=1,b=x;
        while(t){
            if(t&1) a*=b;
            b*=b;
            t/=2;
        }
        return a;
    }
    modint inv() const { return pow(mod-2); }
    modint& operator/=(const modint& a){ return (*this)*=a.inv(); }
    friend modint operator+(const modint& a, const modint& b) { return modint(a)+=b; }
    friend modint operator-(const modint& a, const modint& b) { return modint(a)-=b; }
    friend modint operator*(const modint& a, const modint& b) { return modint(a)*=b; }
    friend modint operator/(const modint& a, const modint& b) { return modint(a)/=b; }
    friend bool operator==(const modint& a, const modint& b) { return (modint(a).x==b.x); }
    friend bool operator!=(const modint& a, const modint& b) { return (modint(a).x!=b.x); }
    friend ostream& operator<<(ostream& os, const modint& m){ os << m.x; return os; }
    friend istream& operator>>(istream& is, modint& m){ is >> m.x; return is; }
};

int main(){
    int k, n;
    modint<10007> s;
    cin >> k >> s >> n;

    vector<modint<10007>> f(k+5), a(n+5);
    f[0] = 1;
    rep(i,k+2){
        f[i+1] += f[i];
        f[i+2] += f[i];
    }

    a[1] = s;
    for(int i=1; i<=n; i++){
        int j = 0;
        while(j<=k && 0<=i-j){
            a[i+1] += a[i-j]/f[j];
            j++;
        }
    }

    cout << a[n] << endl;

}
0