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

15 篇文章 0 订阅

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<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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值