当前位置: 首页 > 工具软件 > Cyclic > 使用案例 >

题解 CF1391C 【Cyclic Permutations 】

薄烨
2023-12-01

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

首先,有一个性质是这样的:对于任意的 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;
}
 类似资料: