http://acm.hdu.edu.cn/showproblem.php?pid=6397
队友瞎推的一个组合数。
具体看代码吧。。
预处理一下阶乘逆元。。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cstdio>
#define mod 998244353
using namespace std;
long long jc[211111];
long long in[211111];
long long qpow(long long x,long long cs)
{
long long ans=1;
while(cs)
{
if(cs&1)
ans=ans*x%mod;
x=x*x%mod;
cs>>=1;
}
return ans;
}
long long C(long long m,long long n)
{
if(n>m)return 0;
return jc[m]*in[n]%mod*in[m-n]%mod;
}
int main()
{
jc[0]=1;
for(int i=1;i<=200000;i++)
{
jc[i]=(jc[i-1]*i)%mod;
}
in[0]=1;
for(int i=1;i<=200000;i++)
{
in[i]=qpow(jc[i],mod-2);
}
int t;
cin>>t;
while(t--)
{
long long n,m,k;
scanf("%lld %lld %lld",&n,&m,&k);
if((n-1)*m<k)
{
printf("0\n");
continue;
}
long long ans=jc[m+k-1]*in[m-1]%mod;
ans=ans*in[k]%mod;
//cout<<ans<<endl;
long long xia=m+k-1-(n);
long long cs=1;
while(xia>=m-1)
{
if(cs%2==1)
{
long long zs=C(m,cs)*C(xia,m-1)%mod;
ans=(ans-zs+mod)%mod;
}
else
{
long long zs=C(m,cs)*C(xia,m-1)%mod;
ans=(ans+zs)%mod;
}
cs++;
xia-=n;
}
cout<<ans<<endl;
}
return 0;
}