白兔的式子

题目:
https://ac.nowcoder.com/acm/problem/15251

已知 f ( 1 , 1 ) = 1 f(1,1)=1 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)=a*f(i-1,j)+b*f(i-1,j-1)\quad i\ge 2,1\le j\le i f(i,j)=af(i1,j)+bf(i1,j1)i2,1ji对于其他情况 f ( i , j ) = 0 f(i,j)=0 f(i,j)=0
T T T组询问,每次给出 a , b , n , m a,b,n,m a,b,n,m,求 f ( n , m ) m o d ( 998244353 ) f(n,m) mod (998244353) f(n,m)mod(998244353)

思路:
类似Problem F: Frightful Formula,只不过变成了往下往右下走,初始位置在 ( 1 , 1 ) (1,1) (1,1),则方案数就是 ( n − 1 m − 1 ) {n-1\choose m-1} (m1n1)。所以 f ( 1 , 1 ) f(1,1) f(1,1)的贡献就是 b m − 1 a n − m ( n − 1 m − 1 ) b^{m-1}a^{n-m}{n-1\choose m-1} bm1anm(m1n1)

#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
const int N=100009;
int T;
ll p[N],p1[N];
ll qpow(ll a,ll b) {
    
    
    ll res=1;
    a%=mod;
    while(b) {
    
    
        if(b&1)
            res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main() {
    
    
    cin>>T;
    p[0]=1;
    for(int i=1; i<N; i++)
        p[i]=p[i-1]*i%mod;
    p1[N-1]=qpow(p[N-1],mod-2);
    for(int i=N-2; i>=0; i--)
        p1[i]=p1[i+1]*(i+1)%mod;
    while(T--) {
    
    
        ll a,b,n,m;
        cin>>a>>b>>n>>m;
        if(n>=1&&m>=1&&m<=n)
            cout<<qpow(b,m-1)*qpow(a,n-m)%mod*p[n-1]%mod*p1[m-1]%mod*p1[n-m]%mod<<endl;
        else
            cout<<0<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43520313/article/details/109105312