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;
}