Christmas
Time limit : 2sec / Memory limit : 1024MB
Score : 400 points
Problem Statement
In some other world, today is Christmas.
Mr. Takaha decides to make a multi-dimensional burger in his party. A level-L burger (L is an integer greater than or equal to 0) is the following thing:
- A level-0 burger is a patty.
- A level-L burger (L≥1) is a bun, a level-(L−1) burger, a patty, another level-(L−1) burger and another bun, stacked vertically in this order from the bottom.
For example, a level-1 burger and a level-2 burger look like BPPPB
and BBPPPBPBPPPBB
(rotated 90 degrees), where B
and P
stands for a bun and a patty.
The burger Mr. Takaha will make is a level-N burger. Lunlun the Dachshund will eat X layers from the bottom of this burger (a layer is a patty or a bun). How many patties will she eat?
Constraints
- 1≤N≤50
- 1≤X≤( the total number of layers in a level-N burger )
- N and X are integers.
Input
Input is given from Standard Input in the following format:
N X
Output
Print the number of patties in the bottom-most X layers from the bottom of a level-N burger.
Sample Input 1
2 7
Sample Output 1
4
There are 4 patties in the bottom-most 7 layers of a level-2 burger (BBPPPBPBPPPBB
).
Sample Input 2
1 1
Sample Output 2
0
The bottom-most layer of a level-1 burger is a bun.
Sample Input 3
50 4321098765432109
Sample Output 3
2160549382716056
A level-50 burger is rather thick, to the extent that the number of its layers does not fit into a 32-bit integer.
第0级 P 第1级 B 第0级 P 第0级 B ......
所以,暴力吧,别无选择。
切割降低级数,n级从中间切,判断在前面还是在后面,在前面就继续切,在后面就加上前面的B的个数,然后切后面
#include<iostream> #include<algorithm> using namespace std; long long ttt(long long n,long long x,long long *arr,long long *brr) { if(x<=n) //提前结束并不会使下面循环x<=0 { return 0; } if(n==0) { return 1; } if(x==arr[n]) //提前跳出 { return brr[n]; } while(1) { if(arr[n]/2==x) //提前跳出 { return brr[n-1]; } else if(arr[n]/2>x) { n--; x--; } else { break; } } long long sum=brr[n-1]+ttt(n-1,x-arr[n-1]-2,arr,brr)+1;//加中间那个肉片 return sum; } int main() { long long n,x; cin>>n>>x; long long arr[51]; long long brr[51]; brr[0]=1; arr[0]=1; for(int i=1;i<=n;i++) { arr[i]=arr[i-1]*2+3; brr[i]=brr[i-1]*2+1; } long long sum=ttt(n,x,arr,brr); cout<<sum; }