链接:https://www.nowcoder.com/acm/contest/73/B
来源:牛客网
有T组询问,每次给出a,b,n,m,求f[n][m] mod (998244353)
第一行为一个整数T,表示询问个数。 接下来一共T行,每行四个整数a,b,n,m。
一共T行,每行一个整数,表示f[n][m] mod (998244353)
2 2 3 3 3 3 1 4 1
9 27
T<=100000
1<=m<=n<=100000
0<=a,b<=109
题解:式子的意义可理解为到第i步,走了j米的方法数,每一步往前走1米有b种方法,原地不动有a种方法,则其生成函数为
(ax^0+bx^1)^(n-1),因为限定了f[1][1],所以求得是第n-1步,走m-1米的方法数,则为(a+bx)^(n-1)展开中第m项。
即为C(m-1,n-1) * a ^ (n-m) * b ^(m - 1)
#include
using namespace std;
using ll = long long ;
using ld = long double;
#define pb push_back
#define SZ(X) ((int)X.size())
#define mp make_pair
#define Fi first
#define Se second
#define pii pair
#define pll pair
#define pli pair
#define pil pair
#define ALL(X) X.begin(),X.end()
#define RALL(X) X.rbegin(),X.rend()
#define rep(i,j,k) for(int i = j;i <= k;i ++)
#define per(i,j,k) for(int i = j;i >= k;i --)
#define mem(a,p) memset(a,p,sizeof(a))
const ll MOD = 998244353;
ll qmod(ll a,ll b) {ll res=1;a%=MOD; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
template
void upmax(T& a,T b){if(a
void upmin(T& a,T b){if(a>b) a=b;}
const int N = 1E5 + 7;
ll f[N];
int main()
{
int T;
scanf("%d",&T);
f[0] = 1;
rep(i,1,N-3) f[i] = f[i-1]*i%MOD;
while(T --) {
int a, b, n, m;
scanf("%d %d %d %d",&a, &b, &n, &m);
ll t1 = f[n-1] * qmod(f[m-1]*f[n-m]%MOD, MOD-2) % MOD;
ll t2 = qmod(a,n-m);
ll t3 = qmod(b,m-1);
ll res = t1 * t2 % MOD * t3 % MOD;
printf("%lld\n",res);
}
return 0;
}