lgP6232题解
评蓝过分了吧,这题最多黄(
首先我们从挂钩的最上层向下走,假设这个挂杆的左边和右边一共有 \(k\) 件衣服。
若 \(k\) 是 \(2\) 的倍数,那么我们只能向左走(左边和右边的衣服一样多)。反之,我们只能向右走。(左边比右边多一件衣服)
然后我们就做完了。。。只需要预处理 \(2\) 的 \(0 \sim n-1\) 次幂。。。
code:
#include<cstdio>
typedef long long ll;
const int mod=1e9+7;
ll k;int n,p[1000005];
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline bool check(int n,ll k){
return n>=63||1ll<<n>=k;
}
int DFS(int n,ll k,int id){
if(!id)return 0;
if(k&1)return Add(p[id],DFS(n,k>>1,id-1));
else return DFS(n,k>>1,id-1);
}
int main(){
scanf("%d%lld",&n,&k);p[0]=1;
for(register int i=1;i<=1000000;++i)p[i]=Add(p[i-1],p[i-1]);
printf("%d",Add(DFS(n,k-1,n-1),1+!check(n-1,k)));
return 0;
}