本来感觉这题的递归写的挺完美的,结果test9就是过不去,看来看去没看出原因,就直接看数据了(要不是CF能看数据可能我坑死也找不出原因来),看了数据就很明了了——大数据过不去,但是明明用了longlong'的啊,,,,原来位移(1<<h)的地方出问题了,那个1默认是int,位移的时候直接溢出了,应该加上后缀ll才能使这个位移式也是longlong的,真是涨姿势了
上代码:
#include<iostream>
typedef long long i64;
using namespace std;
i64 h,n;
i64 solve(i64 h,i64 n,bool L){///进入该子树时的方向
if(L){
if(h==1)
return 3-n;
if(n<=(1ll<<(h-1)))
return (1ll<<h)+solve(h-1,n,L);
else
return 1+solve(h-1,n-(1ll<<(h-1)),!L);
}
else{
if(h==1)
return n;
if(n>(1ll<<(h-1)))
return (1ll<<h)+solve(h-1,n-(1ll<<(h-1)),L);
else
return 1+solve(h-1,n,!L);
}
}
int main(){
cin>>h>>n;
cout<<solve(h,n,0)<<endl;
return 0;
}