白ウサギのポーズ

件名: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≤if(i、j)= a * f(i-1、j)+ b * f(i-1、j-1)\ quad i \ ge 2,1 \ le j \ le if i j =Af i1 j +bf i1 j1 2 1jiその他の場合f(i、j)= 0 f(i、j)= 0f i j =0
TTを持っていますグループTは、a、b、n、ma、b、n、mが与えられるたびに尋ねますA b n m、求f(n、m)mod(998244353)f(n、m)mod(998244353)f n m m o d 9 9 8 2 4 4 3 5 3

アイデア:問題F:恐ろしい式
と同様ですが、右に下がる方向に下がる点が異なりますが、初期位置は(1、1)(1,1)です。1 1 )の場合、オプションの数は(n − 1 m − 1){n-1 \ choicem-1}です。((m 1N - 1したがって、f(1、1)f(1,1)f 1 1 の寄与はbm − 1 a − m(n − 1 m − 1)b ^(m-1)a ^(nm)(n-1 \ choice m-1)bm 1 an mm 1N - 1

#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