結果
問題 | No.2857 Div Array |
ユーザー |
![]() |
提出日時 | 2024-08-25 14:14:58 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 169 ms / 2,000 ms |
コード長 | 2,297 bytes |
コンパイル時間 | 21,043 ms |
コンパイル使用メモリ | 340,436 KB |
最終ジャッジ日時 | 2025-02-24 01:06:42 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 30 |
ソースコード
#pragma GCC target("avx2")#pragma GCC optimize("O3")#pragma GCC optimize("unroll-loops")#include <bits/stdc++.h>#include <atcoder/convolution>#include <atcoder/modint>using namespace std;using namespace atcoder;#define rep(i, n) for(int i=0;i<n;i++)using mint = modint998244353;vector<mint> BerlekampMassey(const vector<mint> &s) {const int N = (int)s.size();vector<mint> b, c;b.reserve(N + 1);c.reserve(N + 1);b.push_back(mint(1));c.push_back(mint(1));mint y = mint(1);for (int ed = 1; ed <= N; ed++) {int l = int(c.size()), m = int(b.size());mint x = 0;for (int i = 0; i < l; i++) x += c[i] * s[ed - l + i];b.emplace_back(mint(0));m++;if (x == mint(0)) continue;mint freq = x / y;if (l < m) {auto tmp = c;c.insert(begin(c), m - l, mint(0));for (int i = 0; i < m; i++) c[m - 1 - i] -= freq * b[m - 1 - i];b = tmp;y = x;} else {for (int i = 0; i < m; i++) c[l - 1 - i] -= freq * b[m - 1 - i];}}reverse(begin(c), end(c));return c;}template <typename T> T BostanMori(std::vector<T> Q, std::vector<T> P, long long N) {const int d = Q.size();for (; N; N >>= 1) {auto Q_neg = Q;for (size_t i = 1; i < Q.size(); i += 2) Q_neg[i] *= -1;P = convolution(P, Q_neg);Q = convolution(Q, Q_neg);for (size_t i = N & 1; i < P.size(); i += 2) P[i >> 1] = P[i];for (size_t i = 0; i < Q.size(); i += 2) Q[i >> 1] = Q[i];P.resize(d - 1);Q.resize(d);}return P[0];}using ll = long long;int main() {ll n, m, k; cin >> n >> m >> k;ll N = 10000;vector<mint> v(N);v[0] = 1;v[1] = m;vector<mint> dp(m + 1, 0);for(ll i = 1; i <= m; i ++) dp[m / i] ++;for(int i = 2; i < N; i ++) {rep(j, m) dp[j + 1] += dp[j];vector<mint> nx(m + 1, 0);for(ll j = 1; j <= m; j ++) {ll num = m / j;nx[num] += dp[min(m, num + k)] - dp[max(0LL, num - k - 1)];}swap(nx, dp);rep(j, m + 1) v[i] += dp[j];}vector<mint> a = BerlekampMassey(v);vector<mint> b = convolution(v, a);b.resize(a.size() - 1);cout << BostanMori(a, b, n).val() << "\n";return 0;}