牛客挑战赛11 B 杨辉三角应用 预处理逆元+阶乘

B
思路: (x+y)^n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。杨辉三角第n行的m个数可表示为 C(n-1,m-1)。
那么本题相当于(ax+by)^n 展开式各项系数。
计算C(n-1,m-1) * a^(n-m) * b ^ m 即可。
Code:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int MOD = 998244353;
const int AX = 1e5+66;
const int MAX = 1e5;
LL fac[AX];
LL inv[AX];

LL C( LL n , LL m ){
    return 1LL * fac[n] * inv[m] % MOD * inv[ n - m ] % MOD;
}

LL quick( LL a, LL b ){
    LL ans = 1LL;
    while( b ){
        if( b & 1 ) ans = ( ans * a ) % MOD;
        b >>= 1 ;
        a = ( a * a ) % MOD; 
    }
    return ans ;
}
int main(){
    int T;
    LL a , b , n , m ;
    fac[0] = 1 ;
    for( int i = 1 ; i <= MAX ; i++ ){
        fac[i] = 1LL * fac[i-1] * i % MOD ;
    }
    inv[MAX] = quick( fac[MAX] , MOD - 2 ) ;
    for( LL i = MAX - 1 ; i >= 0 ; i-- ){
        inv[i] = ( inv[i+1] * ( i + 1 ) ) % MOD;
    }

    scanf("%d",&T);
    while( T-- ){
        scanf("%lld%lld%lld%lld",&a,&b,&n,&m);
        LL res = C( --n , --m ) % MOD;      
        res = ( 1LL * res * quick( a , n - m ) % MOD * quick( b , m ) % MOD );
        printf( "%lld\n" , res );
    }
    return 0 ; 
}

猜你喜欢

转载自blog.csdn.net/FrankAx/article/details/81502198