結果

問題 No.2857 Div Array
ユーザー Nyaa UruzuNyaa Uruzu
提出日時 2024-08-25 16:29:58
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,417 bytes
コンパイル時間 3,691 ms
コンパイル使用メモリ 265,540 KB
実行使用メモリ 35,744 KB
最終ジャッジ日時 2024-08-25 16:30:11
合計ジャッジ時間 7,545 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,764 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 TLE -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for (long long i=0;i<n;i++)
#define loop(i,m,n) for(long long i=m;i<=n;i++)
#define ll long long
#define vl vector<long long>
#define vvl vector<vector<long long>>
#define mod 998244353LL

// 行列の掛け算
vvl multiply(const vvl& A, const vvl& B, ll m) {
    vvl C(m, vl(m, 0));
    rep(i, m) {
        rep(j, m) {
            rep(k, m) {
                C[i][j] += A[i][k] * B[k][j];
                C[i][j] %= mod;
            }
        }
    }
    return C;
}

// 行列累乗
vvl matrixPower(vvl A, ll n, ll m) {
    vvl result(m, vl(m, 0));
    rep(i, m) result[i][i] = 1; // 単位行列
    while (n > 0) {
        if (n % 2 == 1) {
            result = multiply(result, A, m);
        }
        A = multiply(A, A, m);
        n /= 2;
    }
    return result;
}

int main() {
    ll n, m, k;
    cin >> n >> m >> k;

    // 遷移行列の構築
    vvl T(m, vl(m, 0));
    loop(i, 1, m) {
        loop(j, 1, m) {
            if (abs(i - j) <= k) {
                T[i - 1][j - 1] = 1;
            }
        }
    }

    // T^n を計算
    T = matrixPower(T, n - 1, m);

    // 初期状態ベクトル
    vl ans(m, 1);

    // 結果計算
    ll sum = 0;
    rep(i, m) {
        rep(j, m) {
            sum += T[i][j] * ans[j];
            sum %= mod;
        }
    }

    cout << sum << endl;

    return 0;
}
0