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);
}