1 条题解
-
0
递归/分治
将第 阶段的方格可以拆分为 个 阶段的方格,找到其中的变化规律,进行分治即可。
len 表示当前一行点数的 1/2;
cnt 表示当前所有点数的 1/4。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pll pair<ll, ll> const int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1E9 + 7; pll cal(ll n, ll a) { if (n == 0) return {0, 0}; ll len = 1ll << (n - 1); ll cnt = 1ll << (2 * n - 2); pll tm = cal(n - 1, a % cnt); int x = tm.first, y = tm.second; ll f = a / cnt; if (f == 0) return {y, x}; if (f == 1) return {x, y + len}; if (f == 2) return {x + len, y + len}; if (f == 3) return {2 * len - y - 1, len - x - 1}; } int main(int argc, char* argv[]) { ll T, n, a, b; scanf("%lld", &T); while (T--) { scanf("%lld%lld%lld", &n, &a, &b); auto pa = cal(n, a - 1), pb = cal(n, b - 1); ll x = pa.first - pb.first; ll y = pa.second - pb.second; double dis = sqrt(x * x + y * y) * 10; printf("%.0lf\n", dis); } return 0; }
- 1
信息
- ID
- 1435
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 152
- 已通过
- 62
- 上传者