C. Cyclic Permutations
题意: 给一个 n 的全排列,然后构建一个图,节点为每个数的下标,数组中的每个数可以与右边第一个大于它的数,左边第一个大于它的数连接无向边,问在 n 的全排列中有多少排列构成的图中存在简单环。
思路: 一开始题意还读错了,,以为是包含 n 的简单环有多少。。现在想想有点扯。
所以当一个数左右两边存在大于这个数的数,必定能构成一个简单环,例如:
对
于
i
,
j
,
k
,
当
i
>
j
,
k
>
j
对于i,j,k,当i>j,k>j
对于i,j,k,当i>j,k>j ,接下来不管是
i
i
i 和
k
k
k 谁比较大,这三个点都能连接成简单环,所以只要不存在类似的波谷结构就不存在环,那就是单峰序列了,即峰顶为 n 其他的数下降地排列在其左右,所以有
2
n
−
1
2^{n-1}
2n−1 个组合不满足存在简单环,那么
A
n
n
−
2
n
−
1
A_{n}^{n}-2^{n-1}
Ann−2n−1 即可;
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6+7;
const int mod = 1e9+7;
int f[N];
int main()
{
int n;
cin>>n;
f[0] = 1;
for(int i=1;i<=n;i++) f[i] = (LL)f[i-1]*i%mod;
LL t=1;
for(int i=1;i < n;i++) t = t * 2 % mod;
cout<<(f[n] - t + mod) % mod<<"\n";
return 0;
}