我们考虑什么样的情况没有环。
首先,有一个性质是这样的:对于任意的 i ( i ≥ 3 ) i(i\geq 3) i(i≥3),如果 a i a_i ai 是前 i i i 个数中的最大数或最小数,就必定没有环。
如果证明呢?我们考虑反证法。
假设对于任意一个 z ( z ≥ 3 ) z(z\geq 3) z(z≥3) 如果它不是前 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 x↔z,y↔z。
下面,我们分情况讨论:
如果 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 1∼n 中的最大数或最小数。
我们把剩下的数想象成一个双端队列,问题等价于让你求这个队列让你从左边取或右边取,一共有多少种取法。
我们每次可以从左边取或右边取,一共去 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;
}