题目链接:单峰
分析
一开始只想到全排列,搞了个暴力。
后面观察了一下结果,感觉就是
2
n
−
1
2^{n-1}
2n−1。
证明一下这个结论:
因为峰顶一定是n这个数,而对于两边两个一定是第二大和第三大的,然后这三个整块又作为一个峰顶,两边又是当时第二大和第三大的…而这些又是可以互换的。
于是考虑n-1个数分别放在n的左边还是右边。
最后会等于
2
n
−
1
2^{n-1}
2n−1
n比较大你忍一下 ,用快速幂
l
o
g
n
logn
logn实现。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
long long n;
long long ksm(long long x,long long y)
{
long long ans=1;
while(y)
{
if(y&1) ans=ans*x%mod;
x=x*x%mod;
y/=2;
}
return ans%mod;
}
int main()
{
cin>>n;
cout<<ksm(2,n-1)%mod;
return 0;
}