题目
样例输入:
2
样例输出:
2
数据范围:
剖解题目
给出n,问n的全排列中,有多少个的数值是呈单调性或单峰性。
思路
比赛时,一直觉得当最高处在两边时,好像得额外算,WA了。
解法
20%:暴力。
50%:很明显最高处一定是n,那么剩下的n-1个数只可能放在比他高的数的左边或者右边,那么就是两种方案,所以ans=2n−1,计算即可。时间O(n)
100%:快速幂。时间O(logn)。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll mo=1e9+7;
ll n,ans;
ll qsm(ll a,ll b)
{
ll t=1,y=a;
while (b) {
if (b&1) t=t*y%mo;
y=y*y%mo;
b>>=1;
}
return t;
}
int main()
{
scanf("%lld",&n);
if (n==1) printf("1");
else if (n==2) printf("2");
else {
n=n-1;
ans=qsm(2,n);
printf("%lld",ans);
}
}