题解 CF1391C 【Cyclic Permutations 】

我们考虑什么样的情况没有环。

首先,有一个性质是这样的:对于任意的 i ( i ≥ 3 ) i(i\geq 3) i(i3),如果 a i a_i ai 是前 i i i 个数中的最大数或最小数,就必定没有环。

如果证明呢?我们考虑反证法。

假设对于任意一个 z ( z ≥ 3 ) z(z\geq 3) z(z3) 如果它不是前 z z z 个数中的最大数或最小数的话,就必定有一个 x x x 是最小的满足 a x < a z a_x<a_z ax<az 的数, y y y 是最大满足 a y > a z a_y>a_z ay>az 的数。那么 x ↔ z , y ↔ z x \leftrightarrow z,y \leftrightarrow z xz,yz

下面,我们分情况讨论:

  • 如果 x > y x>y x>y,那么 y y y 必定为最大的满足 a y > a x a_y > a_x ay>ax 的数,因为 a y > a z a_y > a_z ay>az 然后 a z > a x a_z > a_x az>ax

  • 如果 x < y x<y x<y,那么 x x x 必定为最小的满足 a x < a y a_x < a_y ax<ay 的数,因为 a x < a z a_x < a_z ax<az 然后 a z < a y a_z < a_y az<ay

证毕。

然后我们考虑这样的序列有多少种,我们这么考虑,第 n n n 个数可能是 1 ∼ n 1\sim n 1n 中的最大数或最小数。

  • 如果是最大数,那么剩余的数为 1 ∼ n − 1 1\sim n-1 1n1
  • 如果是最小数,那么剩余的数位 2 ∼ n 2\sim n 2n

我们把剩下的数想象成一个双端队列,问题等价于让你求这个队列让你从左边取或右边取,一共有多少种取法。

我们每次可以从左边取或右边取,一共去 n n n 次,所以答案为 2 n 2^n 2n

所以,这题的答案为总的排列数 n ! n! n! 减去不合法的排列数 2 n 2^n 2n

const ll mod=1e9+7;
ll pw(ll x,ll y){
	ll ans=1;
	while(y){
		if(y&1)ans=ans*x%mod;
		y>>=1;
		x=x*x%mod;
	}return ans;
}
int work(){
	ll n,ans=1;read(n);
	for(int i=1;i<=n;i++)ans=ans*i%mod;
	ans=(ans-pw(2,n-1)+mod)%mod;//防止负数
	cout<<ans<<endl;
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值