P16351 「Gensokyo OI Round 1」秘神之钥 题解
哪个管理审的,跟我说组合数要使用 \binom 打回,那我问你,我的式子里已经全是括号了,如果用了 \binom 是不是就又要因为括号太乱格式不清晰不便于阅读为由给我打回了?我不改了。
何意味怎么全是没推到底的题解?
我来发一篇模数固定时预处理
首先先放结论:
我们来证明这件事。
首先
考虑记
注意到每次交换要么以
于是把所有
所以
下面对
1. n=2k(k \in \mathbb{Z_{\ge 2}})
这部分较简单,要满足的条件为:
于是
考虑
于是:
2. n=2k+1(k \in \mathbb{Z_{\ge 2}})
这部分略微繁琐一点,要满足的条件为:
于是
于是
和上面那部分类似,不过要先选出
于是:
总结
经过简单的推导,我们得到了
以上过程我计算总共花费 1.1h,由于推导过程十分基础,建议评绿。
:::info[AC 记录] AC Code:
/*
统计不合法的情况数 S 然后用 n! 来减。
记 T 为 p[1]<p[n] 不合法的数量,则 S=2T。(因为所有 p[i] 变为 n+1-p[i] 时限制不变)
n=3 特判(ans=4)
1. n=2k
所有限制为 [2i,2k;1](1<=i<=k-1),[1,2i+1;2k](1<=i<=k-1)
于是 p[2i]>p[1](1<=i<=k-1);p[2i+1]<p[2k](1<=i<=k-1)
则 p[1]<=k,p[2k]>=k+1,记 p[1]=u,p[2k]=v(u<=k,v>=k+1)
T=sum u=1~k(sum v=k+1~2k(C(v-u-1,v-k-1)*((k-1)!)^2))
=((k-1)!)^2*sum u=1~k(sum v=k+1~2k(C(v-u-1,v-k-1)))
=((k-1)!)^2*sum u=1~k(sum v=0~k-1(C(v+(k-u),k-u)))
=((k-1)!)^2*sum u=1~k(C((k-1)+(k-u)+1,k-u+1))
=((k-1)!)^2*sum u=1~k(C(2k-u,k-u+1))
=((k-1)!)^2*sum u=1~k(C(2k-u,k-1))
=((k-1)!)^2*sum u=1~k(C(k-1+u,k-1))
=((k-1)!)^2*(-1+sum u=0~k(C(k-1+u,k-1)))
=((k-1)!)^2*(-1+C(k+(k-1)+1,k-1+1))
=((k-1)!)^2*(-1+C(2k,k))
=-((k-1)!)^2+(2k)!/k^2
ans=(2k)!-2T=(2k)!(1-2/k^2)+2((k-1)!)^2
2. n=2k+1
所有限制为 [2i,2k+1;1](1<=i<=k),[1,2i+1;2k+1](1<=i<=k-1),[1,2;2k+1],[3,2k+1;1]
于是 p[1]<p[2],p[3]<p[2k+1];p[2i]>p[1](2<=i<=k);p[2i+1]<p[2k+1](2<=i<=k-1)
则 p[1]<=k-1,p[2k+1]>=k+2,记 p[1]=u,p[2k+1]=v(u<=k-1,v>=k+2)
T=sum u=1~k-1(sum v=k+2~2k+1((v-u-1)*(v-u-2)*C(v-u-3,v-k-2)*(k-1)!*(k-2)!))
=(k-1)!*(k-2)!*sum u=1~k-1(sum v=k+2~2k+1((v-u-1)*(v-u-2)*C(v-u-3,v-k-2)))
=(k-1)!*(k-2)!*sum u=1~k-1(sum v=k+2~2k+1((v-u-1)*(v-u-2)*C(v-u-3,k-1-u)))
=(k-1)!*(k-2)!*sum u=1~k-1(sum v=0~k-1((v+k+1-u)*(v+k-u)*C(v+k-1-u,k-1-u)))
=(k-1)!*(k-2)!*sum u=1~k-1(sum v=0~k-1((v+k+1-u)!/(k-1-u)!/v!))
=(k-1)!*(k-2)!*sum u=1~k-1((k+1-u)*(k-u)*sum v=0~k-1((v+k+1-u)!/(k+1-u)!/v!))
=(k-1)!*(k-2)!*sum u=1~k-1((k+1-u)*(k-u)*sum v=0~k-1(C(v+k+1-u,k+1-u)))
=(k-1)!*(k-2)!*sum u=1~k-1((k+1-u)*(k-u)*C((k-1)+(k+1-u)+1,k+1-u+1))
=(k-1)!*(k-2)!*sum u=1~k-1((k+1-u)*(k-u)*C(2k+1-u,k+2-u))
=(k-1)!*(k-2)!*sum u=1~k-1((k+1-u)*(k-u)*(2k+1-u)!/(k+2-u)!/(k-1)!)
=(k-1)!*(k-2)!*sum u=1~k-1(((k^2+k)-(2k+1)u+u^2)*(2k+1-u)!/(k+2-u)!/(k-1)!)
=(k-1)!*(k-2)!*sum u=1~k-1((((4k^2+10k+6)-(4k+5)u+u^2)-(3k^2+9k+6)+(2k+4)u)*(2k+1-u)!/(k+2-u)!/(k-1)!)
=(k-1)!*(k-2)!*sum u=1~k-1(((2k+3-u)*(2k+2-u)-(2k+4)*(2k+2-u)+(k^2+3k+2))*(2k+1-u)!/(k+2-u)!/(k-1)!)
=(k-1)!*(k-2)!*sum u=1~k-1((2k+3-u)*(2k+2-u)*(2k+1-u)!/(k+2-u)!/(k-1)!-(2k+4)*(2k+2-u)*(2k+1-u)!/(k+2-u)!/(k-1)!+(k^2+3k+2)*(2k+1-u)!/(k+2-u)!/(k-1)!)
=(k-1)!*(k-2)!*sum u=1~k-1((2k+3-u)!/(k+2-u)!/(k-1)!-(2k+4)*(2k+2-u)!/(k+2-u)!/(k-1)!+(k^2+3k+2)*(2k+1-u)!/(k+2-u)!/(k-1)!)
=(k-1)!*(k-2)!*sum u=1~k-1((k+1)*k*C(2k+3-u,k+1)-(2k+4)*k*C(2k+2-u,k)+(k^2+3k+2)*C(2k+1-u,k-1))
=(k+1)*k*(k-1)!*(k-2)!*sum u=1~k-1(C(2k+3-u,k+1))
-(2k+4)*k*(k-1)!*(k-2)!*sum u=1~k-1(C(2k+2-u,k))
+(k^2+3k+2)*(k-1)!*(k-2)!*sum u=1~k-1(C(2k+1-u,k-1))
=(k+1)*k*(k-1)!*(k-2)!*sum u=3~k+1(C(u+(k+1),k+1))
-(2k+4)*k*(k-1)!*(k-2)!*sum u=3~k+1(C(u+k,k))
+(k^2+3k+2)*(k-1)!*(k-2)!*sum u=3~k+1(C(u+(k-1),k-1))
=(k+1)*k*(k-1)!*(k-2)!*(-1-(k+2)-(k+3)*(k+2)/2+sum u=0~k+1(C(u+(k+1),k+1)))
-(2k+4)*k*(k-1)!*(k-2)!*(-1-(k+1)-(k+2)*(k+1)/2+sum u=0~k+1(C(u+k,k)))
+(k^2+3k+2)*(k-1)!*(k-2)!*(-1-k-(k+1)*k/2+sum u=0~k+1(C(u+(k-1),k-1)))
=(k+1)*k*(k-1)!*(k-2)!*(-1-(k+2)-(k+3)*(k+2)/2+C((k+1)+(k+1)+1,k+1+1))
-(2k+4)*k*(k-1)!*(k-2)!*(-1-(k+1)-(k+2)*(k+1)/2+C((k+1)+k+1,k+1))
+(k^2+3k+2)*(k-1)!*(k-2)!*(-1-k-(k+1)*k/2+C((k+1)+(k-1)+1,k-1+1))
=(k+1)*k*(k-1)!*(k-2)!*(-1-(k+2)-(k+3)*(k+2)/2+C(2k+3,k+2))
-(2k+4)*k*(k-1)!*(k-2)!*(-1-(k+1)-(k+2)*(k+1)/2+C(2k+2,k+1))
+(k^2+3k+2)*(k-1)!*(k-2)!*(-1-k-(k+1)*k/2+C(2k+1,k))
=-(k-1)!*(k-2)!*((k+1)*k*(1+(k+2)+(k+3)*(k+2)/2)-(2k+4)*k*(1+(k+1)+(k+2)*(k+1)/2)+(k^2+3k+2)*(1+k+(k+1)*k/2))
+(k+1)*k*(k-1)!*(k-2)!*C(2k+3,k+2)
-(2k+4)*k*(k-1)!*(k-2)!*C(2k+2,k+1)
+(k^2+3k+2)*(k-1)!*(k-2)!*C(2k+1,k)
=-(k-1)!*(k-2)!*(1/2)*((k+1)*k*(k+3)*(k+4)-2*(k+2)*k*(k+2)*(k+3)+(k+1)*(k+2)*(k+1)*(k+2))
+(k+1)*k*(k-1)!*(k-2)!*C(2k+3,k+2)
-(2k+4)*k*(k-1)!*(k-2)!*C(2k+2,k+1)
+(k^2+3k+2)*(k-1)!*(k-2)!*C(2k+1,k)
=-(k-1)!*(k-2)!*(1/2)*4
+(k+1)*k*(k-1)!*(k-2)!*C(2k+3,k+2)
-(2k+4)*k*(k-1)!*(k-2)!*C(2k+2,k+1)
+(k^2+3k+2)*(k-1)!*(k-2)!*C(2k+1,k)
=-2*(k-1)!*(k-2)!
+(k+1)*k*(k-1)!*(k-2)!*(2k+3)!/(k+2)!/(k+1)!
-(2k+4)*k*(k-1)!*(k-2)!*(2k+2)!/(k+1)!/(k+1)!
+(k^2+3k+2)*(k-1)!*(k-2)!*(2k+1)!/k!/(k+1)!
=-2*(k-1)!*(k-2)!
+(2k+3)!/((k+2)*(k+1)*k*(k-1))
-(2k+4)*(2k+2)!/((k+1)*(k+1)*k*(k-1))
+(k^2+3k+2)*(2k+1)!/(k*(k+1)*k*(k-1))
=-2*(k-1)!*(k-2)!
+(2k+3)!/((k+2)*(k+1)*k*(k-1))
-(4k+8)*(2k+1)!/((k+1)*k*(k-1))
+(k^2+3k+2)*(2k+1)!/(k*(k+1)*k*(k-1))
=-2*(k-1)!*(k-2)!+(2k+1)!/((k+2)*k*(k+1)*k*(k-1))*((2k+3)*(2k+2)*k-(4k+8)*(k+2)*k+(k^2+3k+2)*(k+2))
=-2*(k-1)!*(k-2)!+(2k+1)!/((k+2)*(k+1)*k^2*(k-1))*(k^3-k^2-2k+4)
ans=n!-2T
=(2k+1)!-2*(-2*(k-1)!*(k-2)!+(2k+1)!/((k+2)*(k+1)*k^2*(k-1))*(k^3-k^2-2k+4))
=(2k+1)!+4*(k-1)!*(k-2)!-2*(2k+1)!/((k+2)*(k+1)*k^2*(k-1))*(k^3-k^2-2k+4)
=4*(k-1)!*(k-2)!+(2k+1)!*(1-2*(k^3-k^2-2k+4)/((k+2)*(k+1)*k^2*(k-1)))
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,m,k;
ll e,ans,u[1000009],v[1000009];
inline ll w(ll a,ll b){return !b?1:b==1?a:b&1?w(a*a%m,b>>1)*a%m:w(a*a%m,b>>1);}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n>>m,k=n>>1,ans=0;
if(n==3){cout<<"4\n";continue;}
if(!(n&1)){
e=1;
for(int i=2;i<k;++i) e=e*i%m;
ans=2*e*e%m;
for(int i=k+1;i<n;++i) e=e*i%m;
ans+=(2*k*(ll)k-4)%m*e%m;
cout<<ans%m<<"\n";
}
else{
u[0]=1;
for(int i=1;i<=n;++i) u[i]=u[i-1]*i%m;
v[n]=w(u[n],m-2);
for(int i=n;i;--i) v[i-1]=v[i]*i%m;
ans=(4*u[k-1]*u[k-2]%m+(1-2*(k*(ll)k%m*(k-1)%m-2*k+4)%m*v[k+2]%m*u[k-2]%m*v[k]%m*u[k-1])%m*u[n]%m+m)%m;
cout<<ans<<"\n";
}
}
return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
int n=20,a[109];
int main(){
iota(a+1,a+n+1,1);
for(int i=1;i<=n;++i){
int l=(i==1?n:i-1),r=(i==n?1:i+1);
cout<<min(a[l],a[r])<<","<<max(a[l],a[r])<<";"<<a[i]<<"\n";
swap(a[l],a[r]);
}
return 0;
}
*/
:::
闲话
我在赛时一开始忘记特判