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);
    }
  • 相关阅读:
    Netty相关知识积累
    Java内存管理
    使用nginx-upload-module搭建文件上传服务器
    mysql 5.7自动安装脚本
    CDH5集群搭建
    Linux常用命令
    编译原理要点四
    编译原理要点三
    编译原理要点二:
    编译原理要点
  • 原文地址:https://www.cnblogs.com/shikeyu/p/13260943.html
Copyright © 2011-2022 走看看