【3】题解:P4931 [MtOI2018] 情侣?给我烧了!(加强版)【组合数学】
我们考虑如何使用组合数学来做这道生成函数。你首先知道这是一个错排问题。考虑一个组合方案是
然后其他的情况就需要考虑情侣
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e6+10;
const ll P=998244353;
ll qp(ll a,ll b){
ll res=1;
for(;b;b>>=1,a=(a*a)%P)
if(b&1) res=(res*a)%P;
return res;
}
ll fac[N],fiv[N],f[N],p2[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n=5e6,k,T;
fac[0]=1, p2[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%P,
p2[i]=p2[i-1]*2%P;
fiv[n]=qp(fac[n],P-2);
for(int i=n;i>=1;i--)
fiv[i-1]=fiv[i]*i%P;
f[0]=1,f[1]=0;
for(int i=2;i<=n;i++)
f[i]=(f[i-1]+f[i-2]*2*(i-1)%P)%P*4%P*i%P*(i-1)%P;
cin>>T;
while(T--){
cin>>n>>k;
cout<<fac[n]*fiv[n-k]%P*fac[n]%P*fiv[k]%P*fiv[n-k]%P*p2[k]%P*f[n-k]%P<<"\n";
}
return 0;
}