あなたが行く(X、Y)は、系の原点(0,0)を直交座標平面です。各操作は、X軸正方向又はY軸方向に沿って移動することができる、唯一1つの長さ部を移動させることができます。
(x、y)は異なるパスの数(0,0)からの要求は、それが(X、Y)に達していない場合は出力され-1。入力フォーマット:
二つの整数の行は、yはxは。スペースで区切られています。| X |≤2000、| Y |≤2000
出力フォーマット:
だけ998244353の出力する必要があるので、数が多すぎるかもしれないので、異なる経路の数の(x、y)に(0,0)から発現和整数ライン、
モジュロの結果。(X、Y)に達していない場合は出力され-1。サンプル入力:
1 1
出力例:
2
まず第一に:ありません指定されたx、yの大小関係。
議論の最初のポイント
ゼロ未満のXY場合は-1
-この質問:数カトレアない(カトレア番号:2つだけ動き、最初の2つのプレK動作中は、少なくともK動作でなければならない)
EG(20、2)
それらの理解:
GO TO 22のステップの合計このステップ22において、ステップ2に上向きのジャンプ- 22は、組み合わせの数、2から引き出され
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int mod=998244353;
const int maxn=4100;
int c[maxn][maxn];
int main(){
int x,y;
cin >> x >> y;
if(x<0 || y<0) //只能沿正方向运动
cout << -1 << endl;
int n = x+y;
for(int i=0; i<=n; i++) //初始
c[i][0] = c[i][i] = 1;
for(int i=2; i<=n; i++) //组合数的运算
for(int j=1; j<=i/2; j++){ //算一半即可
c[i][j] = (c[i-1][j] + c[i-1][j-1])%mod;
c[i][i-j] = c[i][j];
}
cout << c[x+y][x] << endl;
return 0;
}