結果
| 問題 |
No.2067 ±2^k operations
|
| コンテスト | |
| ユーザー |
QCFium
|
| 提出日時 | 2022-09-02 22:42:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 63 ms / 2,000 ms |
| コード長 | 1,436 bytes |
| コンパイル時間 | 1,888 ms |
| コンパイル使用メモリ | 171,024 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-16 05:03:34 |
| 合計ジャッジ時間 | 4,078 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
int ri() {
int n;
scanf("%d", &n);
return n;
}
void solve() {
int64_t t;
std::cin >> t;
std::vector<int> dd;
while (t) dd.push_back(t & 1), t >>= 1;
std::pair<int64_t, int64_t> dp[3][2][2];
memset(dp, 0, sizeof(dp));
dp[1][0][0] = {1, 0};
for (auto d : dd) {
std::pair<int64_t, int64_t> next[3][2][2];
memset(next, 0, sizeof(next));
for (int j = 0; j < 3; j++) for (int k = 0; k < 2; k++) for (int l = 0; l < 2; l++) if (dp[j][k][l].first) {
for (int m = 0; m < 2; m++) {
int next_j = j;
if (m < d) next_j = 0;
if (m > d) next_j = 2;
int next_k = m;
int next_l = l;
if (!k && !m) next_l = 0;
if (k && m) next_l = 1;
int cost = m && (!k || !l);
next[next_j][next_k][next_l].first += dp[j][k][l].first;
next[next_j][next_k][next_l].second += dp[j][k][l].first * cost;
next[next_j][next_k][next_l].second += dp[j][k][l].second;
}
}
memcpy(dp, next, sizeof(dp));
/*
for (int j = 0; j < 3; j++) for (int k = 0; k < 2; k++) for (int l = 0; l < 2; l++) if (dp[j][k][l].first) {
std::cerr << j << " " << k << " " << l << " : " << dp[j][k][l].first << " " << dp[j][k][l].second << std::endl;
}*/
}
int64_t res = 0;
for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) res += dp[0][i][j].second + dp[1][i][j].second;
printf("%" PRId64 "\n", res);
}
int main() {
int t = ri();
for (int i = 0; i < t; i++) solve();
return 0;
}
QCFium