我们说一个数列 {ai} 是单峰的,当且仅当存在一个位置 k 使得 ai < ai+1(i < k) 且 ai > ai+1(i ≥ k)。 现在小X 想知道,对于 1 到 n 的所有排列,其中有多少个是单峰数列。
1.1 20 分做法
生成所有全排列并判断,时间复杂度 O(n · n!)。
1.2 50 分做法
根据排列组合可以发现,峰顶一定是 n,因此考虑 1 ∼ n - 1 分别放在 n 的左边还是右边,一一得出相应
的唯一方案。所以答案就是 2^(n-1),时间复杂度 O(n)。
1.3 100 分做法
对2^(n-1)用快速幂即可,时间复杂度 O(log n)。
ps手摸找规律也可
#include<iostream> #define ll long long using namespace std; const int mod=1e9+7; ll n; ll mul(ll a,ll b,ll p){ ll ans=0; for(;b;b >>= 1){ if(b & 1) ans=(ans + a) % p; a = a*2 % p; } return ans; } ll qpow(ll a,ll b,ll mo){ ll ans=1; for(;b;b >>= 1){ if(b & 1) ans=mul(ans,a,mo); a = mul(a,a,mo); } return ans; } int main() { cin>>n; cout<<qpow(2,n-1,mod); }