单峰

我们说一个数列 {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);
}
原文地址:https://www.cnblogs.com/shikeyu/p/13260943.html