#include <cstdlib>
#include <iostream>
#include <unordered_map>
#include "dzilib.h"
int64_t next_power_of_2(int64_t n) {
int ret = 1;
while (n >= ret) {
ret *= 2;
}
return ret;
}
void one() {
int64_t n = GetN();
int64_t rem = 0;
std::unordered_map<int64_t, int64_t> cache;
for (int i = 0; ; ++i) {
int64_t pow = next_power_of_2(n);
int64_t step = (int64_t)1 << i;
if (step > n) {
break;
}
int64_t tested = pow + step - rem;
for (;;) {
while (tested >= pow * 2 - n) {
pow *= 2;
tested = pow + step - rem;
}
if (!cache.count(tested)) {
cache[tested] = Ask(tested);
}
int64_t ret = cache[tested];
if (ret == (i + 1) * 2) {
break;
}
tested += step;
}
rem += !(((tested + rem) / step) % 2) * step;
}
Answer(rem);
}
int main() {
int t = GetT();
for (int i = 0; i < t; ++i) {
one();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <cstdlib> #include <iostream> #include <unordered_map> #include "dzilib.h" int64_t next_power_of_2(int64_t n) { int ret = 1; while (n >= ret) { ret *= 2; } return ret; } void one() { int64_t n = GetN(); int64_t rem = 0; std::unordered_map<int64_t, int64_t> cache; for (int i = 0; ; ++i) { int64_t pow = next_power_of_2(n); int64_t step = (int64_t)1 << i; if (step > n) { break; } int64_t tested = pow + step - rem; for (;;) { while (tested >= pow * 2 - n) { pow *= 2; tested = pow + step - rem; } if (!cache.count(tested)) { cache[tested] = Ask(tested); } int64_t ret = cache[tested]; if (ret == (i + 1) * 2) { break; } tested += step; } rem += !(((tested + rem) / step) % 2) * step; } Answer(rem); } int main() { int t = GetT(); for (int i = 0; i < t; ++i) { one(); } } |
English