結果
問題 | No.1887 K Consecutive Ks (Easy) |
ユーザー |
![]() |
提出日時 | 2022-03-06 17:23:47 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 27 ms / 2,000 ms |
コード長 | 1,408 bytes |
コンパイル時間 | 3,408 ms |
コンパイル使用メモリ | 233,524 KB |
最終ジャッジ日時 | 2025-01-28 07:17:45 |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 16 |
ソースコード
#include <bits/stdc++.h>using namespace std;#include <atcoder/modint>using namespace atcoder;using mint = modint998244353;#include <atcoder/convolution>vector<mint> dp1, dp2, D, pw;void init(int N, int M){D.assign(N + 10, 0);for (int i = 2; i <= M; i++){for (int k = 1; k * i <= N; k++){D.at(k * i - 1)++;}}pw.resize(N + 10);pw.at(0) = 0, pw.at(1) = 1, pw.at(2) = M - 2;for (int i = 2; i < N; i++){pw.at(i + 1) = (M - 1) * pw.at(i);}dp1.assign(N + 10, 0);dp2.resize(N + 10);dp2.at(0) = 1;for (int i = 0; i < N; i++){dp2.at(i + 1) = (M - 1) * dp2.at(i);}}vector<mint> getvec(const vector<mint> &v, int l, int r){return {v.begin() + l, v.begin() + r};}void onlineconvolution(int l, int r){if (l + 1 == r)return;int m = (l + r) / 2;onlineconvolution(l, m);auto dp20 = getvec(dp2, l, m);auto D0 = getvec(D, 0, r - l);auto r1 = convolution(dp20, D0);for (int i = m; i < r; i++){dp1.at(i) += r1.at(i - l);}auto dp10 = getvec(dp1, l, m);auto pw0 = getvec(pw, 0, r - l);auto r2 = convolution(dp10, pw0);for (int i = m; i < r; i++){dp2.at(i) -= r2.at(i - l);}onlineconvolution(m, r);}int main(){int N, M;cin >> N >> M;init(N, M);onlineconvolution(0, N + 1);mint ans = ((mint)M).pow(N) - dp2.at(N);cout << ans.val() << endl;}