模板:
可以求负数的组合数模板
typedef long long ll;
const ll mod=1e9+7;
const int N =2e5+5;
ll inv[N] = {1,1}; //inv[i] i的逆元。
ll fac[N] = {1,1}; // fac[i] i!%mod
ll facv[N] = {1,1}; // facv[i] i!的逆元
void init()
{
for(int i = 2 ; i < N ; i ++)
inv[i] = (mod-mod/i) * inv[mod%i] % mod;
for(int i = 2 ; i < N ; i ++)
facv[i] = facv[i-1] * inv[i] % mod;
for(int i = 2 ; i < N ; i ++)
fac[i] = fac[i-1]*i % mod;
}
inline ll C(ll n, ll m) {
if(n >= 0) {
if(n >= m) return fac[n]*facv[m]%mod*facv[n-m]%mod;
return 0;
}
n = -n;
ll res=fac[n+m-1]*facv[n-1]%mod;
if(m&1) res=mod-res;
return res*facv[m]%mod;
}
#include<bits/stdc++.h>
/// hdu 6397
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int N =2e5+5;
ll inv[N] = {1,1}; //inv[i] i的逆元。
ll fac[N] = {1,1}; // fac[i] i!%mod
ll facv[N] = {1,1}; // facv[i] i!的逆元
void init()
{
for(int i = 2 ; i < N ; i ++)
inv[i] = (mod-mod/i) * inv[mod%i] % mod;
for(int i = 2 ; i < N ; i ++)
facv[i] = facv[i-1] * inv[i] % mod;
for(int i = 2 ; i < N ; i ++)
fac[i] = fac[i-1]*i % mod;
}
ll C(ll n,ll m)
{
if(n<m) return 0;
if(m < 0) return 0;
return fac[n]*facv[m]%mod*facv[n-m]%mod;
}
ll n,m,k;
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld %lld %lld",&n,&m,&k);
ll ans=C(k+m-1,m-1);
int f=-1;
int p=1;
while(k-p*n+m-1>0&&k-n*p+m-1>=m-1&&p<=m){
ll tmp=C(m,p)%mod*C(k-n*p+m-1,m-1);
ans=(ans+tmp*f+mod)%mod;
p++;
f=f*(-1);
}
while(ans<0) ans+=mod;
printf("%lld\n",ans);
}
return 0;
}