1.题目
问题描述
某个世界中,今天是圣诞节。
在高先生的派对上,他决定做一个多维汉堡。等级 L汉堡 ( 是大于等于 L的整数) 是这样的:
- 等级0汉堡是1片肉饼。
- 等级L汉堡(L>=1) 是一个按如下顺序从下往上叠放的东西:1片面包、等级L-1汉堡、1片肉饼、等级L-1汉堡、1片面包。
例如,用 P
表示肉饼,用 B
表示面包,等级1的汉堡看起来像 BPPPB
(将它逆时针旋转90度),等级2的汉堡看起来像 BBPPPBPBPPPBB
。
高羽先生要制作一个等级为N(1<=50)的汉堡。腊肠犬 Runrun 将从这个汉堡底部吃掉X(1<=X<=N等级的汉堡的总层数)层 (把1片面包或1片肉饼算作1层)。Runrun 会吃掉多少片肉饼?
输入格式
输入个空格间隔的整数:N X
输出格式
输出一个整数,表示等级为N的汉堡底部X层中包含的肉饼数目。
样例输入 1
2 7
样例输出 1
4
样例输入 2
1 1
样例输出 2
0
样例输入 3
50 4321098765432109
样例输出 3
2160549382716056
题目大意
字符串Stri:
i=0时:Stri=P;
i>=1时: Stri=B+Stri-1+P+Stri-1+B;
求字符串为Strx-1的前X个字符中有多少个为P 。
2.分析
这道题一看就是递归,咱们新建一个函数,需要分类讨论;
建个函数
long long pd(int x,long long y)
{
if(x==0) return 1;
if(y==1) return 0;
else if(y<=c[x-1]+1) return pd(x-1,y-1);
else if(y==c[x-1]+2) return a[x-1]+1;
else if(y<=c[x-1]*2+2) return a[x-1]+pd(x-1,y-c[x-1]-2)+1;
else return a[x];
}
基本完成了
3.AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
long long k;
long long a[52],c[52];
long long pd(int x,long long y)
{
if(x==0) return 1;
if(y==1) return 0;
else if(y<=c[x-1]+1) return pd(x-1,y-1);
else if(y==c[x-1]+2) return a[x-1]+1;
else if(y<=c[x-1]*2+2) return a[x-1]+pd(x-1,y-c[x-1]-2)+1;
else return a[x];
}
int main()
{
cin>>n>>k;
a[0]=1;
c[0]=1;
for(int i=1;i<=50;i++)
{
a[i]=a[i-1]*2+1;
c[i]=c[i-1]*2+3;
}
cout<<pd(n,k);
return 0;
}