菲菲和牛牛

题目描述

菲菲和牛牛在一块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;
}
原文地址:https://www.cnblogs.com/hellohhy/p/13306898.html