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;
}
posted @ 2022-01-10 16:11  Prean  阅读(22)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};