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;
}
posted @ 2021-12-29 11:47  wzx_believer  阅读(43)  评论(0编辑  收藏  举报