Pose de conejo blanco

Asunto:
https://ac.nowcoder.com/acm/problem/15251

Se sabe que f (1, 1) = 1 f (1,1) = 1f ( 1 ,1 )=1, 有
f (i, j) = a ∗ f (i - 1, j) + b ∗ f (i - 1, j - 1) yo ≥ 2, 1 ≤ j ≤ si (i, j) = a * f (i-1, j) + b * f (i-1, j-1) \ quad i \ ge 2,1 \ le j \ le if ( yo ,j )=unf ( yo-1 ,j )+segundof ( yo-1 ,j-1 )yo2 ,1ji Para otros casosf (i, j) = 0 f (i, j) = 0f ( yo ,j )=0
tieneTTEl grupo T pregunta, cada vez quese dan a, b, n, ma, b, n, muna ,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 )

Idea:
Similar al Problema F: Fórmula espantosa , excepto que gira hacia abajo para bajar a la derecha, la posición inicial es (1, 1) (1,1)( 1 ,1 ) , entonces el número de opciones es(n - 1 m - 1) {n-1 \ elija m-1}(m - 1n - 1) . Entoncesf (1, 1) f (1,1)f ( 1 ,La contribución de 1 ) esbm - 1 an - m (n - 1 m - 1) b ^ (m-1) a ^ (nm) (n-1 \ elija m-1)segundom - 1 an - m (m - 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43520313/article/details/109105312
Recomendado
Clasificación