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
",(Pow(2,n)-2+mod)%mod);
}
原文地址:https://www.cnblogs.com/CHK666/p/14591299.html