- 简化问题:求距离->求A、B两点的坐标
- 把握本质:只考虑操作对坐标的影响
- 简化运算:给1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16分组需要特判整除,归根结底是因为没有从0开始编号,把它们各自减1,变成0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15,就不需要特判了
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> pll;
double dist(pll a,pll b)
{
double x=10.0*abs(a.first-b.first);
double y=10.0*abs(a.second-b.second);
return sqrt(x*x+y*y);
}
pll calc(int n,long long x)
{
if(n==0)
{
return pll(1,1);
}
long long area=(1ll<<(2*(n-1)));
pll y=calc(n-1,x%area);
switch(x/area)
{
case 0:
return pll(y.second,y.first);
break;
case 1:
return pll(y.first,y.second+(1<<(n-1)));
break;
case 2:
return pll(y.first+(1<<(n-1)),y.second+(1<<(n-1)));
break;
default:
return pll((1<<(n-1))+1-y.second+(1<<(n-1)),(1<<(n-1))+1-y.first);
break;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
long long n,a,b;
cin>>n>>a>>b;
a--;
b--;
cout<<fixed<<setprecision(0)<<dist(calc(n,a),calc(n,b))<<endl;
}
return 0;
}