chocolate Counting(牛客)
分析:
排列为 1 2 3 ... p
p+1 p+2 p+3 ... 2p
2p+1 2p+2 ... 3p
.
.
(k-1)p+1 ... kp
发现如果我们选择同一行的p个数 一定是p的倍数
像此类p的倍数或者模数的问题 考虑分类 分为摸p的余数[0,p-1]这么多类
现在考虑kp个数里面选p个数 对于从上到下有选择的第一行 我们将改行所有选择的数循环移动
一定可以保证p次移动中 有一个能满足题意 特别的要排除同一行选p个的情况
所以答案为((C(kp,p)-k)/p)+k
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
inline int dec(int a,int b){return (a-b<0)?a-b+mod:a-b;}
inline int quick_pow(int a,int b){
int ret=1;for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ret=1ll*ret*a%mod;
return ret;
}
inline int Inv(int a){
return quick_pow(a,mod-2);
}
#define ll long long
int T,p,k;
inline int C(ll n,ll m){
ll fz=1,fm=1;
for(int i=0;i<m;++i)fz=fz*((n-i)%mod)%mod,fm=fm*(i+1)%mod;
return 1ll*fz*Inv(fm)%mod;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d",&p,&k);
printf("%d\n",(1ll*dec(C(1ll*p*k,p),k)*Inv(p)+k)%mod);
}
return 0;
}