結果
問題 | No.1106 🦉 何事もバランスが大事 |
ユーザー |
|
提出日時 | 2020-07-15 22:51:13 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 7 ms / 2,000 ms |
コード長 | 2,092 bytes |
コンパイル時間 | 1,744 ms |
コンパイル使用メモリ | 105,696 KB |
最終ジャッジ日時 | 2025-01-11 21:18:02 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 77 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:64:15: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 64 | i64 N; scanf("%ld", &N); | ~~~~~^~~~~~~~~~~
ソースコード
#include <algorithm> #include <cassert> #include <cmath> #include <iostream> #include <vector> using namespace std; using i64 = int64_t; vector<int> conv(i64 x, int base) { assert(base % 2 == 1); vector<int> v; while(x != 0) { int rem = static_cast<int>(x % base); if(rem > base / 2) { rem -= base; } v.push_back(rem); x -= rem; assert(x % base == 0); x /= base; } reverse(v.begin(), v.end()); return v; } // 上から i64 f(i64 x) { vector<int> a = conv(x, 5); int n = static_cast<int>(a.size()); // dp[桁][未満フラグ][先行ゼロを抜けたか][荷物側(桁の数字が負)の分銅数][反対側(桁の数字が正)の分銅数] := パターン数 vector<vector<vector<vector<vector<i64>>>>> dp(n+1, vector<vector<vector<vector<i64>>>>(2, vector<vector<vector<i64>>>(2, vector<vector<i64>>(n+1, vector<i64>(n+1, 0))))); dp[0][0][0][0][0] = 1; for(int i=0; i<n; ++i) { for(int less=0; less<2; ++less) { for(int nuke0=0; nuke0<2; ++nuke0) { for(int cntM=0; cntM<=n; ++cntM) { // n を含めるのを忘れないように for(int cntP=0; cntP<=n; ++cntP) { // 同上 if(!dp[i][less][nuke0][cntM][cntP]) { continue; } // [l, r] int l = nuke0 ? -2 : 0, r = less ? 2 : a[i]; for(int d=l; d<=r; ++d) { int nless = less || d < a[i], n_nuke0 = nuke0 || d > 0, ncntM = cntM + (d < 0 ? -d : 0), ncntP = cntP + (d > 0 ? d : 0); if(ncntM > n) { continue; } if(ncntP > n) { continue; } dp[i+1][nless][n_nuke0][ncntM][ncntP] += dp[i][less][nuke0][cntM][cntP]; } } } } } } i64 res = 0; for(int less=0; less<2; ++less) { for(int cnt=1; cnt<=n; ++cnt) { res += dp[n][less][1][cnt][cnt]; } } return res; } int main(void) { i64 N; scanf("%ld", &N); assert(1 <= N && N <= static_cast<i64>(powl(10, 18))); i64 res = f(N); printf("%ld\n", res); return 0; }