蓝桥杯-皮亚诺曲线
#include
#include
using namespace std;
int n,k,x,y;
void add(int a,int b,int sss){
if(a==1){
switch(sss){
case 0:
switch(b){
case 1:x+=1;y+=1;break;
case 2:x+=1;y+=2;break;
case 3:x+=2;y+=2;break;
case 4:x+=2;y+=1;break;
}
break;
case 1:
switch(b){
case 1:x+=1;y+=1;break;
case 2:x+=2;y+=1;break;
case 3:x+=2;y+=2;break;
case 4:x+=1;y+=2;break;
}
break;
case 2:
switch(b){
case 1:x+=2;y+=2;break;
case 2:x+=1;y+=2;break;
case 3:x+=1;y+=1;break;
case 4:x+=2;y+=1;break;
}
break;
case 3:
switch(b){
case 1:x+=2;y+=2;break;
case 2:x+=2;y+=1;break;
case 3:x+=1;y+=1;break;
case 4:x+=1;y+=2;break;
}
break;
}
return;
}
int one=pow(2,2*a-2),ss=0;
while(b-one>0) b-=one,ss++;
switch(sss){
case 0:
switch(ss){
case 0:add(a-1,b,1);break;
case 1:y+=pow(2,a-1);add(a-1,b,0);break;
case 2:x+=pow(2,a-1);y+=pow(2,a-1);add(a-1,b,0);break;
case 3:x+=pow(2,a-1);add(a-1,b,2);break;
}
break;
case 1:
switch(ss){
case 0:add(a-1,b,0);break;
case 1:x+=pow(2,a-1);add(a-1,b,1);break;
case 2:x+=pow(2,a-1);y+=pow(2,a-1);add(a-1,b,1);break;
case 3:y+=pow(2,a-1);add(a-1,b,3);break;
}
break;
case 2:
switch(ss){
case 0:x+=pow(2,a-1);y+=pow(2,a-1);add(a-1,b,3);break;
case 1:y+=pow(2,a-1);add(a-1,b,2);break;
case 2:add(a-1,b,2);break;
case 3:x+=pow(2,a-1);add(a-1,b,0);break;
}
break;
case 3:
switch(ss){
case 0:x+=pow(2,a-1);y+=pow(2,a-1);add(a-1,b,2);break;
case 1:x+=pow(2,a-1);add(a-1,b,3);break;
case 2:add(a-1,b,3);break;
case 3:y+=pow(2,a-1);add(a-1,b,1);break;
}
break;
}
}
int main(void){
cin>>n>>k;
int i=0;
while(n/=2) i++;
x=y=0;
add(i,k,0);
cout << x << ' ' << y;
return 0;
}