AcCoder Contest-115 D - Christmas
D - 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.
题意: 一个L级别的汉堡由 一个b ,一个L-1级别的汉堡, 一个p, 一个L-1级别的汉堡, 一个b 共五层组成。
0 级别的汉堡单独由 p 组成。
例如 1级别的汉堡由 b, 1-1, p, 1-1, b 也就是bpppb
2级别的汉堡由 b, 2-1, p, 2-1, b 组成 也就是b(bpppb)p(bpppb)b
问: 现在有一个N级别的汉堡,从最底层(最顶层)开始吃 吃掉x层后,一共吃掉了多少层p
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 long long arr[55]; 6 long long stu[55]; 7 long long ans = 0; 8 int n; 9 long long x; 10 void f(int d){ 11 if(x==arr[d]){//如果吃x层会整好吃完级别为 d 的汉堡 12 ans += stu[d]; 13 return ; 14 }else if(x){ 15 x--;// 吃掉最底层的 b 16 if(x>arr[d-1]){// x 落在了上面的 L-1 级的汉堡 17 x-=arr[d-1];//吃掉下面的 L-1 级的汉堡 18 ans += stu[d-1];// L-1级别的汉堡有stu[l-1]层 p 19 x--;// 吃掉中间的 p 20 ans++; 21 if(x)f(d-1);// 进入上面的 L-1 级的汉堡 22 //这里可以不进行if判断直接进入 因为进入后还会判断x非零 23 } else f(d-1);// 落点在下面的 L-1 级汉堡 24 } 25 } 26 int main(){ 27 arr[0] = 1; 28 arr[1] = 5; 29 arr[2] = 13; 30 stu[0] = 1; 31 stu[1] = 3; 32 stu[2] = 7; 33 for(int i=3;i<51;i++){ 34 //arr[i] = 1+arr[i-1]+1+arr[i-1]+1; 35 arr[i] = arr[i-1]*2+3;// 级别为 i 的汉堡的层数 b+p 36 stu[i] = stu[i-1]*2+1;// 级别为 i 的汉堡的 p 的数量 37 } 38 scanf("%d%lld",&n,&x); 39 f(n); 40 printf("%lld\n",ans); 41 return 0; 42 }