【快速幂+递推】单峰排列

【题目描述】

一 个 n 的 全 排 列 A[i] 是 单 峰 的 , 当 且 仅 当 存 在 某 个 x 使 得
A[1]<A[2]<...<A[x]>A[x+1]>...> A[n]。
例如,对于 9 的全排列,125798643 是一个单峰排列,123456789 也是一个单峰排列,
但 356298741 就不是。
试求 n 的单峰全排列的个数。
【输入数据】
输入一个数 n。
输出数据
输出 n 的全排列中单峰排列的个数。
由于这个数可能很大,因此你只需要输出它 mod 1234567 的值。
输入样例

3

输出样例

4

样例说明
共有以下 4 种方案:个数
123
132
231
321

【解题思路】

根据数据,不难得出,n的全排列中单峰排列的个数为2n-1个,所以用快速幂就可以解决

代码如下

 1  #include <iostream>
 2  using namespace std;
 3 int N=1234567;
 4  long long qpow (long long a,long long b)
 5  {
 6      long long base=a,ans=1;
 7      while (b!=0)
 8      {
 9          if (b&1!=0)
10         {
11             ans*=base;
12             ans%=N;
13         }  
14          base*=base;
15          base%=N;
16          b>>=1;
17      }
18      return ans%N;
19  }
20  int main()
21  {
22      long long n;
23      cin>>n;
24      n-=1;
25      cout<<qpow(2,n);
26  }    

 

posted @ 2019-06-20 21:04  夜雨声烦fff  阅读(132)  评论(0编辑  收藏