题解:AT_abc483_g [ABC483G] Qualification
MaxBlazeResFire · · 题解
不妨设
根据你的计数直觉,不难发现要枚举
接下来一步,显然是对每个人计算它在方案
你发现枚举
::::success[Code]
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
#define MAXN 2000005
int n,k,fac[MAXN],inv[MAXN],ifac[MAXN];
inline int C( int n , int m ){ return n >= m && n >= 0 && m >= 0 ? fac[n] * ifac[m] % mod * ifac[n - m] % mod : 0; }
inline void solve(){
scanf("%lld%lld",&n,&k);
if( n == 2 * k ){ puts("0"); return; }
int ans = 0;
for( int r = 1 ; r <= k ; r ++ )
ans = ( ans + C( k , r ) * C( n - k , k - r ) % mod * r % mod * inv[n + r - 2 * k] % mod ) % mod;
printf("%lld\n",ans * fac[n] % mod * fac[k] % mod * fac[n - k] % mod * ( n - 2 * k ) % mod);
}
signed main(){
fac[0] = inv[1] = ifac[0] = 1;
for( int i = 1 ; i < MAXN ; i ++ ) fac[i] = fac[i - 1] * i % mod;
for( int i = 2 ; i < MAXN ; i ++ ) inv[i] = ( mod - mod / i ) * inv[mod % i] % mod;
for( int i = 1 ; i < MAXN ; i ++ ) ifac[i] = ifac[i - 1] * inv[i] % mod;
int t; scanf("%lld",&t);
while( t -- ) solve();
return 0;
}
::::