1、由编号求坐标
struct point {ll x, y;};
point get(ll n, ll id)
{
if(n == 0) return {0, 0};
ll tot = 1ll << n * 2 - 2, len = 1ll << n - 1;
point p = get(n - 1, id % tot);
ll x = p.x, y = p.y;
int area = id / tot;
if(area == 0) return {y, x};
else if(area == 1) return {x, y + len};
else if(area == 2) return {x + len, y + len};
else return {len * 2 - y - 1, len - x - 1};
}
int main()
{
ll n, id;
point p = get(n, id);
printf("%lld %lld\n", p.x, p.y);
return 0;
}
2、由坐标求编号
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#define sf(n) scanf("%d", &n)
#define endl '\n'
#define cyes cout<<"yes"<<endl
#define debug(x) cout<<"-----"<<x<<endl
using namespace std;
ll dfs(ll n, ll x, ll y)
{
if(n == 0) return 0;
ll tot = 1ll << n * 2 - 2, len = 1ll << n - 1;
int area;
if(x < len) area = (y < len) ? 0 : 1;
else area = (y < len) ? 3 : 2;
if(area == 0) return dfs(n - 1, y, x);
else if(area == 1) return dfs(n - 1, x, y - len) + tot;
else if(area == 2) return dfs(n - 1, x - len, y - len) + tot * 2;
else return dfs(n - 1, len - y + 1, len * 2 - x + 1) + tot * 3;
}
int main()
{
ll n, x, y;
cin >> n >> x >> y;
cout << dfs(n, x, y) + 1 << endl;
//编号从1开始就加1,从0开始不加
return 0;
}