結果
| 問題 |
No.1923 Divisor Array
|
| ユーザー |
りあん
|
| 提出日時 | 2022-05-03 23:48:21 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 100 ms / 2,000 ms |
| コード長 | 2,379 bytes |
| コンパイル時間 | 3,778 ms |
| コンパイル使用メモリ | 262,648 KB |
| 実行使用メモリ | 67,712 KB |
| 最終ジャッジ日時 | 2024-07-02 22:28:27 |
| 合計ジャッジ時間 | 7,708 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 51 |
ソースコード
// #pragma GCC target("avx2")
#pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
const int M = 998244353;
long long powmod(long long a, long long b) {
long long res = 1;
while (b) {
if (b & 1) {
res = res * a % M;
}
b >>= 1;
a = a * a % M;
}
return res;
}
long long inv(long long a) {
return powmod(a, M - 2);
}
int blim = 2048;
vector<vector<long long>> binom_small(blim, vector<long long>(blim));
long long binom(int n, int r) {
if (n - r < r) r = n - r;
if (n < 0 || r < 0 || n < r) return 0;
if (n < blim) return binom_small[n][r];
long long u = 1, d = 1;
for (int i = 0; i < r; ++i) {
u = u * (n - i) % M;
d = d * (i + 1) % M;
}
return u * inv(d) % M;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
for (int i = 0; i < blim; ++i) {
binom_small[i][0] = binom_small[i][i] = 1;
for (int j = 1; j < i; ++j) {
binom_small[i][j] = (binom_small[i - 1][j - 1] + binom_small[i - 1][j]) % M;
}
}
int n, m, k;
cin >> n >> m >> k;
vector<vector<long long>> dp1(m + 3, vector<long long>(m + 3));
dp1[0][1] = 1;
for (int i = 1; i < m + 3; ++i) {
vector<long long> imos(m + 4);
for (int j = 0; j < m + 3; ++j) {
imos[j + 1] = (imos[j] + dp1[i - 1][j]) % M;
}
for (int j = 1; j < m + 3; ++j) {
dp1[i][j] = (imos[j] - imos[(j + 1) / 2] + M) % M;
}
}
vector<long long> x(m + 3);
for (int i = 0; i < m + 3 && i <= n; ++i) {
long long b = binom(n, i);
for (int j = 0; j + 1 < m + 3; ++j) {
x[j] = (x[j] + dp1[i][j + 1] * b) % M;
}
}
vector<vector<long long>> dp2(13, vector<long long>(m + 3));
dp2[0][1] = 1;
for (int i = 0; i + 1 < 13; ++i) {
for (int j = 1; j < m + 3; ++j) {
for (int l = 2; j * l < m + 3; ++l) {
dp2[i + 1][j * l] = (dp2[i + 1][j * l] + dp2[i][j] * x[l - 1]) % M;
}
}
}
long long ans = 0;
for (int i = 0; i < 13; ++i) {
long long p = binom(k, i);
for (int j = 0; j <= m; ++j) {
ans = (ans + dp2[i][j] * p) % M;
}
}
cout << ans << '\n';
return 0;
}
りあん