結果
問題 | No.1492 01文字列と転倒 |
ユーザー |
![]() |
提出日時 | 2021-04-30 23:06:17 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 112 ms / 4,000 ms |
コード長 | 1,102 bytes |
コンパイル時間 | 723 ms |
コンパイル使用メモリ | 68,096 KB |
実行使用メモリ | 7,296 KB |
最終ジャッジ日時 | 2024-07-19 02:54:01 |
合計ジャッジ時間 | 2,610 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
#include <iostream>#include <algorithm>#define rep(i, n) for(i = 0; i < n; i++)using namespace std;int n, m;int dp[2][101][4951];int snuke(int n, int i) {return min(i, 2 * n - i);}//途中は良いカッコ列じゃなくて良いので、転倒数が結構増えることに注意int rng(int n, int i) {return min(((i + 1) / 2) * (i / 2), n * (n - 1) / 2);}signed main() {int i, j, k;cin >> n >> m;dp[0][0][0] = 1;rep(i, 2 * n) {int snu1 = snuke(n, i);int rin1 = rng(n, i);int snu2 = snuke(n, i + 1);int rin2 = rng(n, i + 1);for (j = 0; j <= snu1; j++) {if ((i - j) & 1) continue;int one = (i - j) / 2;for (k = 0; k <= rin1; k++) {if (j + 1 <= snu2) {(dp[1][j + 1][k + one] += dp[0][j][k]) %= m;}if (j - 1 >= 0) {(dp[1][j - 1][k] += dp[0][j][k]) %= m;}}}rep(j, snu2 + 1) rep(k, rin2 + 1) dp[0][j][k] = dp[1][j][k];rep(j, snu2 + 1) rep(k, rin2 + 1) dp[1][j][k] = 0;}rep(i, n * n + 1) {if (i > rng(n, 2 * n)) { cout << 0 << endl; continue; }cout << dp[0][0][i] << endl;}return 0;}