結果
問題 | No.2413 Multiple of 99 |
ユーザー |
![]() |
提出日時 | 2023-08-11 23:41:22 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 277 ms / 8,000 ms |
コード長 | 1,906 bytes |
コンパイル時間 | 3,514 ms |
コンパイル使用メモリ | 211,544 KB |
実行使用メモリ | 24,360 KB |
最終ジャッジ日時 | 2024-11-18 19:21:15 |
合計ジャッジ時間 | 6,970 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h>#include <atcoder/convolution>using namespace std;const long long MOD = 998244353;long long modpow(long long a, long long b){long long ans = 1;while (b > 0){if (b % 2 == 1){ans *= a;ans %= MOD;}a *= a;a %= MOD;b /= 2;}return ans;}int main(){int N, K;cin >> N >> K;auto get = [&](int N, int m){vector<long long> inv(N * 9 + 1);if (N > 0){inv[1] = 1;}for (int i = 2; i <= N * 9; i++){inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;}vector<long long> h(N * 9 + 1, 0);h[0] = 1;for (int i = 1; i <= N * 9; i++){for (int j = 1; j <= 9; j++){if (j <= i){h[i] += h[i - j] * j;h[i] %= MOD;}}h[i] *= N;h[i] %= MOD;for (int j = 1; j <= 9; j++){if (j <= i){h[i] -= (i - j) * h[i - j] % MOD;if (h[i] < 0){h[i] += MOD;}}}h[i] *= inv[i];h[i] %= MOD;}int N2 = N / 11 + 1;vector<vector<long long>> ans(99, vector<long long>(N2, 0));for (int i = 0; i <= N * 9; i++){ans[i * m % 99][i / 99] = h[i];}return ans;};vector<vector<long long>> A = get((N + 1) / 2, 1);vector<vector<long long>> B = get(N / 2, 10);vector<long long> g(N * 9 + 1, 0);for (int i = 0; i < 99; i++){for (int j = 0; j < 99; j++){if ((i + j) % 99 == 0){vector<long long> C = atcoder::convolution(A[i], B[j]);int sz = C.size();for (int k = 0; k < sz; k++){if (i + j * 10 % 99 + k * 99 <= N * 9){g[i + j * 10 % 99 + k * 99] += C[k];g[i + j * 10 % 99 + k * 99] %= MOD;}}}}}long long ans = 0;for (int i = 0; i <= N * 9; i++){ans += g[i] * modpow(i, K) % MOD;ans %= MOD;}cout << ans << endl;}