From 4d657d308ccc01701afefed6723d7610f0c5ce1b Mon Sep 17 00:00:00 2001 From: KunoiSayami Date: Thu, 4 Aug 2022 21:52:52 +0800 Subject: feat: Implement expt_0802 Signed-off-by: KunoiSayami --- expt_0802.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 expt_0802.cpp (limited to 'expt_0802.cpp') diff --git a/expt_0802.cpp b/expt_0802.cpp new file mode 100644 index 0000000..32727fb --- /dev/null +++ b/expt_0802.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include + +using namespace std; + +vector> a; +vector result; +constexpr size_t LENGTH = 2048; + +void calculate(int l, int r, int dep) { + if (l > r) + return; + int mid = (l + r) >> 1; + a[dep].push_back(mid + 1); + calculate(l, mid - 1, dep + 1); + calculate(mid + 1, r, dep + 1); +} + +size_t calculate_location(size_t index) { + // auto value = result[index + 1]; + auto real_index = ++index; + int step = 0; + while (index > 0) { + index /= 2; + step++; + } + auto end = (int)std::pow(2, step - 1); + auto location = LENGTH / end / 2 * (real_index % end * 2 + 1); + if (location == 0) { + location = LENGTH; + } + // printf("%d %d %d %lu %lu\n", step, end, value, real_index % end, location); + return location; +} + +int main() { + int n = LENGTH; + + int c = 0; + for (int k = n; k; k >>= 1) + c++; + a.resize(c); + calculate(0, n - 1, 0); + for (auto &i : a) { + for (int &j : i) { + // cout << j << ' '; + result.push_back(j); + } + } + cout << endl; + + for (int i = 0; i < LENGTH; i++) { + assert(calculate_location(i) == result[i]); + } + return 0; +} -- cgit v1.3.1