导航

zhx's contest题解

zhx's contest题解

题目大意

解题思路

整段区间单调递增、单调递减有2种情况。
对于先增后减的情况,我们需要找出最大值。
对于先减后增的情况,我们需要找出最小值。
其余各数只需要分居在最大值(最小值)两侧即可,有\(2^{n-1}*2\)种方案
然而,整段区间单调递增、单调递减的情况,我们各多算了1次。
于是,答案就是\(2^n-1\)

代码

#include<cstdio>
using namespace std;
#define ll long long
ll n,mod;
ll mul(ll a,ll b){
	ll rec=0;
	for(;b;b>>=1,a=(a+a)%mod)
		if(b&1)rec=(rec+a)%mod;
	return rec;
}
ll Pow(ll a,ll b){
	ll rec=1;
	for(;b;b>>=1,a=mul(a,a))
		if(b&1)rec=mul(rec,a);
	return rec;
}
int main(){
	while(scanf("%lld%lld",&n,&mod)!=EOF)printf("%lld\n",(Pow(2,n)-2+mod)%mod);
}

posted on 2021-03-29 10:19  CHK666  阅读(50)  评论(0编辑  收藏  举报