NOIP提高组 单峰

来源:互联网 发布:java程序员面试一年 编辑:程序博客网 时间:2024/05/18 17:55

Description

这里写图片描述
由于答案可能很大,所以输出答案为除以109+7后的余数

Data Constraint

这里写图片描述

Solution

我们发现当一个位置i确定为峰顶时,左边1~i-1的数一旦选定,它的顺序和i+1~n的顺序是唯一确定的。那么我们只要考虑左边的数选哪些就好了,这样的种类数是Ci1n1,所以总的答案是n1i=0Ci1n1,我们列出n=1~4的答案后发现,n1i=0Ci1n1=2n1,所以对于一次询问,我们只要用快速幂求2n1,时间复杂度为O(logN)。

代码

#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define ll long longusing namespace std;const ll maxn=1000000007;ll n,i,t,j,k,l,ans;ll mi(ll x){    if (!x) return 1;    if (x==1) return 2;     ll t=mi(x/2);    if (x%2) return t*t%maxn*2%maxn;return t*t%maxn;}int main(){    scanf("%lld",&n);    ans=mi(n-1);    printf("%lld",ans);}
3 0