牛客练习赛11B 白兔的式子


链接:https://www.nowcoder.com/acm/contest/73/B
来源:牛客网

已知 f[1][1]=1,f[i][j]=a*f[i-1][j]+b*f[i-1][j-1](i>=2,1<=j<=i)。
对于其他情况f[i][j]=0

有T组询问,每次给出a,b,n,m,求f[n][m] mod (998244353)

输入描述:

第一行为一个整数T,表示询问个数。
接下来一共T行,每行四个整数a,b,n,m。

输出描述:

一共T行,每行一个整数,表示f[n][m] mod (998244353)
示例1

输入

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 <bits/stdc++.h>

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<int,int>
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define pil pair<int,ll>
#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<class T>
void upmax(T& a,T b){if(a<b) a=b;}
template<class T>
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值