1. 程式人生 > 實用技巧 >菲菲和牛牛

菲菲和牛牛

題目描述

菲菲和牛牛在一塊n行m列的棋盤上下棋,菲菲執黑棋先手,牛牛執白棋後手。

棋局開始時,棋盤上沒有任何棋子,兩人輪流在格子上落子,直到填滿棋盤時結束。落子的規則是:一個格子可以落子當且僅當這個格子內沒有棋子且這個格子的左側及上方的所有格子內都有棋子。

_Itachi聽說有不少學弟在省選現場AC了D1T1,解決了菲菲和牛牛的問題,但是_Itachi聽說有的人認為複雜度玄學,_Itachi並不想難為學弟學妹,他想為大家節約時間做剩下的題,所以將簡化版的D1T1帶給大家。

_Itachi也在一塊n行m列的棋盤上下棋,不幸的是_Itachi只有黑棋,不過幸好只有他一個人玩。現在,_Itachi想知道,一共有多少種可能的棋局(不考慮落子順序,只考慮棋子位置)。

_Itachi也不會為難學弟學妹們去寫高精度,所以只需要告訴_Itachi答案mod 998244353(一個質數)的結果。

輸入格式

第一行包括兩個整數n,m表示棋盤為n行m列。

輸出格式

一個整數表示可能的棋局種數。

樣例

樣例輸入1

1 1

樣例輸出1

2

樣例輸入2

2 3

樣例輸出2

10

樣例輸入3

10 10

樣例輸出3

184756

資料範圍與提示

對於 \(20\)% 的資料 \(n,m<=10\)
對於 \(30\)% 的資料 \(n,m<=20\)
另有 \(20\)% 的資料 \(n<=5\)
另有 \(20\)% 的資料 \(m<=5\)
對於\(100\)

% 的資料 \(n,m<=100000\)

code

/*
1 2 3 4 5 6 7 3
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int ny(int a){
	int ans=1;
	int n=mod-2;
	while(n){
		if(n&1)ans=ans*a%mod;
		a=a*a%mod;
		n>>=1;
	}
	return ans;
}
long long jc(int x){
	long long ans = 1;
	for(int i=1;i<=x;i++) 
		ans=ans*i%mod;
	return ans;
}
signed main(){
	int n,m;cin>>n>>m;
	int tmp=jc(n)*jc(m)%mod;
	int ans=jc(n+m)*ny(tmp)%mod;
	return cout<<ans<<endl,0;
}