C. Cyclic Permutations(663 div 2 排列组合)

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} 2n1 个组合不满足存在简单环,那么 A n n − 2 n − 1 A_{n}^{n}-2^{n-1} Ann2n1 即可;

#include
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;
}

你可能感兴趣的:(CF,数学)