地址:https://codeforces.com/gym/101667/attachments
因为外层的图形是从内层的图形变化得来的,只要知道他们之间是怎样转换的即可,每个图形分为四个部分;
先分析w1的图形,如何转换到w2的;
w2的图形分为四个部分:
1>x:1~ 2 y:1~2
通过w1的图形x,y坐标相互交换
2>x:1~2 y:3 ~ 4
w1图形x坐标不变,y坐标+2^(k - 1)
3>x: 3 ~ 4 y: 3 ~ 4
w1图形x,y坐标都 + 2^(k - 1)
4>x: 3 ~ 4 y: 1 ~ 2
w1图形的第i个点对应w2图形的n - i + 1 点;
将x,y坐标交换后,x坐标 + 2 * abs(x - 2^(k - 1))+ 1,y坐标不变
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
#define mp make_pair
#define pb push_back
#define fi first
#define se second
int a[35];
pair<int,int> dfs(int k,int id)
{
//cout << id << endl;
if(k == 1){
pair<int,int>tmp;
switch(id){
case 1:tmp = mp(1,1);break;
case 2:tmp = mp(1,2);break;
case 3:tmp = mp(2,2);break;
case 4:tmp = mp(2,1);break;
}
return tmp;
}
int t = a[2 * k - 2];
pair<int,int>ans;
if(id >= 1 && id <= t){
pair<int,int> tmp = dfs(k - 1,id);
ans.fi = tmp.se;
ans.se = tmp.fi;
}
if(id >= t + 1 && id <= 2 * t){
pair<int,int> tmp = dfs(k - 1,id - t);
ans.fi = tmp.fi;
ans.se = tmp.se + a[k - 1];
}
if(id >= 2 * t + 1 && id <= 3 * t){
pair<int,int> tmp = dfs(k - 1,id - 2 * t);
ans.fi = tmp.fi + a[k - 1];
ans.se = tmp.se + a[k - 1];
}
if(id >= 3 * t + 1 && id <= 4 * t){
pair<int,int> tmp = dfs(k - 1,t - id + 3 * t + 1);
ans.fi = tmp.se + 2 * abs(tmp.se - a[k - 1]) + 1;
//cout << tmp.fi << " " << tmp.se << endl;
ans.se = tmp.fi;
}
return ans;
}
int main()
{
a[0] = 1;
for(int i = 1;i <= 32;++i){
a[i] = 2 * a[i - 1];
}
int n,m;
while(~scanf("%d %d",&n,&m)){
int k;
for(int i = 1;i <= 15;++i){
if(n == a[i]){
k = i;
break;
}
}
pair<int,int> ptr = dfs(k,m);
printf("%d %d\n",ptr.fi,ptr.se);
}
return 0;
}