結果
| 問題 |
No.3182 recurrence relation’s intersection sum
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-13 22:33:44 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 342 ms / 2,000 ms |
| コード長 | 2,733 bytes |
| コンパイル時間 | 3,501 ms |
| コンパイル使用メモリ | 286,540 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-06-13 22:33:54 |
| 合計ジャッジ時間 | 10,049 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 40 |
ソースコード
// Pythonの元コードをC++に忠実に翻訳したもの
// オリジナルのアルゴリズムや定数、変数名は保持
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 998244353;
const ll inf = 1001001001001001001LL;
struct Comb {
vector<ll> fac, finv;
int mod;
Comb(int lim, int mod_ = 998244353): fac(lim+1), finv(lim+1), mod(mod_) {
fac[0] = fac[1] = 1;
for (int i = 2; i <= lim; ++i) fac[i] = fac[i-1] * i % mod;
finv[lim] = powmod(fac[lim], mod - 2);
for (int i = lim; i >= 2; --i) finv[i-1] = finv[i] * i % mod;
finv[0] = 1;
}
ll powmod(ll a, ll b) const {
ll res = 1;
a %= mod;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll C(int a, int b) const {
if (b < 0 || a < b) return 0;
return fac[a] * finv[b] % mod * finv[a - b] % mod;
}
};
using Matrix = vector<vector<ll>>;
Matrix mat_mul(const Matrix &a, const Matrix &b) {
int n = a.size(), m = b[0].size(), l = b.size();
Matrix res(n, vector<ll>(m));
for (int i = 0; i < n; ++i)
for (int k = 0; k < l; ++k)
for (int j = 0; j < m; ++j)
res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod;
return res;
}
Matrix mat_pow2(const Matrix &a) {
int n = a.size();
Matrix res(n, vector<ll>(n));
for (int i = 0; i < n; ++i)
for (int k = 0; k < n; ++k)
for (int j = 0; j < n; ++j)
res[i][j] = (res[i][j] + a[i][k] * a[k][j]) % mod;
return res;
}
Matrix mat_pow(Matrix a, ll exp) {
int n = a.size();
Matrix res(n, vector<ll>(n));
for (int i = 0; i < n; ++i) res[i][i] = 1;
for (int i = 63; i >= 0; --i) {
if ((exp >> i) & 1) res = mat_mul(res, a);
if (i == 0) return res;
res = mat_pow2(res);
}
return res;
}
ll solve(int k, ll x, const Comb& comb) {
int d = k + 4;
Matrix mat(d, vector<ll>(d));
mat[0][0] = k;
mat[0][d - 2] = 1;
mat[0][d - 1] = 1;
mat[1][0] = 1;
mat[1][1] = 1;
for (int m = 0; m <= k; ++m)
for (int j = 0; j <= m; ++j)
mat[2 + m][2 + j] = comb.C(m, j);
mat[d - 1][d - 1] = k;
Matrix res = mat_pow(mat, x);
Matrix v(d, vector<ll>(1));
v[0][0] = 1;
v[2][0] = 1;
v[d - 1][0] = 1;
Matrix final = mat_mul(res, v);
return final[1][0];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int k;
ll l, r;
cin >> k >> l >> r;
Comb comb(1000);
ll ans = (solve(k, r + 1, comb) - solve(k, l, comb) + mod) % mod;
cout << ans << '\n';
}