結果
問題 | No.2067 ±2^k operations |
ユーザー | ygussany |
提出日時 | 2022-08-29 22:16:35 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 80 ms / 2,000 ms |
コード長 | 1,874 bytes |
コンパイル時間 | 273 ms |
コンパイル使用メモリ | 31,744 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-06 19:23:17 |
合計ジャッジ時間 | 2,657 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 29 ms
6,820 KB |
testcase_02 | AC | 29 ms
6,820 KB |
testcase_03 | AC | 29 ms
6,816 KB |
testcase_04 | AC | 29 ms
6,816 KB |
testcase_05 | AC | 29 ms
6,816 KB |
testcase_06 | AC | 19 ms
6,820 KB |
testcase_07 | AC | 79 ms
6,820 KB |
testcase_08 | AC | 78 ms
6,820 KB |
testcase_09 | AC | 79 ms
6,816 KB |
testcase_10 | AC | 78 ms
6,820 KB |
testcase_11 | AC | 80 ms
6,820 KB |
testcase_12 | AC | 79 ms
6,820 KB |
testcase_13 | AC | 79 ms
6,820 KB |
testcase_14 | AC | 79 ms
6,816 KB |
testcase_15 | AC | 79 ms
6,820 KB |
testcase_16 | AC | 79 ms
6,820 KB |
testcase_17 | AC | 80 ms
6,816 KB |
testcase_18 | AC | 80 ms
6,816 KB |
testcase_19 | AC | 4 ms
6,820 KB |
testcase_20 | AC | 6 ms
6,820 KB |
testcase_21 | AC | 79 ms
6,816 KB |
testcase_22 | AC | 79 ms
6,816 KB |
testcase_23 | AC | 79 ms
6,820 KB |
ソースコード
#include <stdio.h> long long bit[61]; long long solve(long long N) { int i, j, jj, jjj, k, kk, kkk, cur, prev; long long dp[2][33][3][3] = {}, ans = 0; for (i = 60; (N & bit[i]) == 0; i--); dp[0][0][2][0] = 1; for (i--, k = 0, kk = 0, kkk = 1, cur = 1, prev = 0; i >= 0; i--, cur ^= 1, prev ^= 1) { for (j = 0; j <= 30; j++) for (jj = 0; jj <= 2; jj++) for (jjj = 0; jjj <= 2; jjj++) dp[cur][j][jj][jjj] = 0; for (j = 0; j <= 30; j++) { dp[cur][j+1][2][0] += dp[prev][j][0][1]; dp[cur][j][0][2] += dp[prev][j][0][1]; dp[cur][j][1][0] += dp[prev][j][0][2]; dp[cur][j][0][2] += dp[prev][j][0][2]; dp[cur][j+2][2][0] += dp[prev][j][1][0]; dp[cur][j+1][0][2] += dp[prev][j][1][0]; dp[cur][j][2][0] += dp[prev][j][2][0]; dp[cur][j][0][1] += dp[prev][j][2][0]; } if ((N & bit[i]) == 0) { if (kk == 0) { if (kkk == 1) { k++; kk = 2; kkk = 0; } else { kk = 1; kkk = 0; } } else if (kk == 1) { k += 2; kk = 2; } } else { if (kk == 0) { if (kkk == 1) dp[cur][k+1][2][0]++; else dp[cur][k][1][0]++; } else if (kk == 1) dp[cur][k+2][2][0]++; else dp[cur][k][2][0]++; if (kk == 0) { if (kkk == 1) kkk = 2; } else if (kk == 1) { k++; kk = 0; kkk = 2; } else { kk = 0; kkk = 1; } } } if (kk == 0) { if (kkk == 1) ans += k + 1; else ans += k + 2; } else if (kk == 1) ans += k + 2; else ans += k; for (j = 0; j <= 30; j++) { ans += dp[prev][j][0][1] * (j + 1); ans += dp[prev][j][0][2] * (j + 2); ans += dp[prev][j][1][0] * (j + 2); ans += dp[prev][j][2][0] * j; } return ans; } int main() { int T; long long N; scanf("%d", &T); int i; for (i = 1, bit[0] = 1; i <= 60; i++) bit[i] = bit[i-1] << 1; while (T--) { scanf("%lld", &N); printf("%lld\n", solve(N)); } fflush(stdout); return 0; }