官方题解
我只是来复习一下lucas定理然后贴一下代码(普通求组合数也能过)(逃~~)
#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
const int mod=998244353;
const int N=5050;
ll fact[N*N];
void init(){
fact[0]=1;
for(int i=1;i<=N*N;i++) {
fact[i]=fact[i-1]*i%mod;//初始化阶乘
}
}
ll fastme(ll base,ll index,ll mod){//快速幂求逆元
ll res=1;
while(index){
if(index&1) res=(ll)res*base%mod;
index>>=1;
base=(ll)base*base%mod;
}
return res;
}
ll c(ll a,ll b){//求组合数
return (ll)fact[a]*fastme(fact[a-b],mod-2,mod)%mod*fastme(fact[b],mod-2,mod)%mod;
}
ll lucas(int a,int b){//卢卡斯定理求大数组合数,范围适用1<=b<=a<=1e18
if(a<mod&&b<mod) return c(a,b);
return (ll)lucas(a%mod,b%mod)*c(a/mod,b/mod)%mod;
}
int main(){
init();
int _;
cin>>_;
while(_--){
int n;
cin>>n;
ll ans=0;
for(int i=1;i<=n;i++){
ll temp=lucas(n*n-i,n-1)*n%mod;
ans=(ans+temp)%mod;
}
ans=ans*fact[n]%mod*fact[n*n-n]%mod;
cout<<ans%mod<<endl;
}
return 0;
}