Loading

题解—工业题

只能说还是我太菜了。

昨天就没取模,今天还没涨教训。

自己不看数据范围,炸了怪谁。

\(\Huge{一定要记住,在取模的时候大于模数的都要取!!!}\)

这个规律还是不难推的,就是我考场上比较傻,一会想打表找规律,一会又坚信自己可以做出来,浪废了很多时间。

首先很好推的就是上走一步会乘\(b\),右走一步会乘\(a\)
然后就是系数的问题。

画出来找依照规律,发现就是到达那个地方的方案数。
所以直接组合数学就行了。

时间复杂度\(O(n+m)\)

注意,由于我们需要\(n+m\)的组合数,所以数组一定要开够,二倍!!!

#include <cstdio>
#include <cstring>
#include <algorithm>
#define R register int
#define int long long
#define printf Ruusupuu = printf
#define scanf Ruusupuu = scanf
#define freopen rsp_5u = freopen

int Ruusupuu ;
FILE * rsp_5u ;

using namespace std ;
typedef long long L ;
typedef long double D ;
typedef pair<int , int> PI ;
const int N = 6e5 + 10 ;
const int M = 998244353 ;

inline void of(){ freopen( "a_sample2.in" , "r" , stdin ) , freopen( "a.out" , "w" , stdout ) ; }
inline void cf(){ fclose( stdin ) , fclose( stdout ) ; }
inline void J( int & a , int b ){ a = ( a + b ) % M ; }
inline int read(){
	int w = 0 ; bool fg = 0 ; char ch = getchar() ;
	while( ch < '0' || ch > '9' ) fg |= ( ch == '-' ) , ch = getchar() ;
	while( ch >= '0' && ch <= '9' ) w = ( w << 1 ) + ( w << 3 ) + ( ch - '0' ) , ch = getchar() ;
	return fg ? -w : w ;
}

int n , m , a , b , x [N] , y [N] , js [N] , inv [N] , ins [N] , ans , powa [N] , powb [N] ; 

void sc(){
	n = read() , m = read() , a = read() % M , b = read() % M ;
	
	for( R i = 1 ; i <= n ; i ++ ) x [i] = read() % M ; 
	for( R i = 1 ; i <= m ; i ++ ) y [i] = read() % M ;
	
	js [0] = inv [0] = inv [1] = ins [0] = ins [1] = powa [0] = powb [0] = 1 ; 
	
	for( R i = 1 ; i < N ; i ++ ) js [i] = ( 1ll * js [i - 1] * i ) % M ;
	for( R i = 2 ; i < N ; i ++ ) inv [i] = ( 1ll * ( M - M / i ) * inv [M % i] ) % M ;
	for( R i = 2 ; i < N ; i ++ ) ins [i] = ( 1ll * ins [i - 1] * inv [i] ) % M ;
	
	for( R i = 1 ; i < N ; i ++ ) powa [i] = ( 1ll * powa [i - 1] * a ) % M ;
	for( R i = 1 ; i < N ; i ++ ) powb [i] = ( 1ll * powb [i - 1] * b ) % M ;
}

inline int C( int n , int m ){ return ( 1ll * ( 1ll * js [n] * ins [m] ) % M * ins [n - m] ) % M ; }

void work(){
	for( R i = 1 ; i <= n ; i ++ ) J( ans , ( ( x [i] * C( n + m - i - 1 , m - 1 ) % M ) * ( ( powa [m] * powb [n - i] ) % M ) ) % M ) ;
	for( R i = 1 ; i <= m ; i ++ ) J( ans , ( ( y [i] * C( n + m - i - 1 , n - 1 ) % M ) * ( ( powa [m - i] * powb [n] ) % M ) ) % M ) ;
	printf( "%lld\n" , ans ) ; 
}

signed main(){
//	of() ;
	sc() ;
	work() ;
//	cf() ;
	return 0 ;
}
posted @ 2021-07-13 16:00  Soresen  阅读(39)  评论(0)    收藏  举报