組み合わせの数 - 行く(x、y)は

あなたが行く(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;
}

公開された62元の記事 ウォンの賞賛0 ビュー1756

おすすめ

転載: blog.csdn.net/jhckii/article/details/104344546
おすすめ