zoukankan      html  css  js  c++  java
  • 单峰

    我们说一个数列 {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);
    }
  • 相关阅读:
    最小生成树之算法记录【prime算法+Kruskal算法】【模板】
    hdoj 1869 六度分离【最短路径求两两边之间最长边】
    la3211
    codeforces round #414 div1+div2
    bzoj1823
    bzoj3112
    bzoj1061&&bzoj3256
    单纯形&&线性规划
    bzoj1494
    bzoj3105
  • 原文地址:https://www.cnblogs.com/shikeyu/p/13260943.html
Copyright © 2011-2022 走看看