トピックへのリンク:https://nanti.jisuanke.com/t/40451
質問の意味:(0,0)から横軸は少なくとも縦少なくともyを移動し、X行くそれぞれ、(N、N)来て、少なくともどのように多くの移動端に問い合わせます。
分析:それでは、理論的には、各パスのnステップ(1つのステップの合計)に、各ステップ(N / Xのステップの合計)xから行くことができる、唯一の最小を提供する、ビューの一次元点で開始するが、最大値を指定しません動きの様々な。二次元ながら、これは、あなたが上がるしたい場合は、X = 2、Y = 3、各パスは、互いに独立していますが、どこへ行くのステップの数は、たとえば、一般的であり、N = 6しかしどのように多くの手順、ちょうど1次元のケースの下にありますステップ数は、その後、xは2つのステップを取る必要がありますので、唯一の、2つのステップを取ることができる3つのステップ、xとyを取る必要があります。そして、もう一つのステップは、小さな行くために数を制限することであることを行きます。
次に、N個のM(Mは移動するステップ数である)グループに割り当てられ、各グループが少なくともXの手順を歩いていた、我々は最初に、各グループの缶工程に約一次元ルックから、実際にグループ化問題である式を、分析を開始X-1サブステップ、その上に各画分の少なくとも1つの工程の後に、この方法は、セパレータによって実現することができる、すなわち、n個のアイテムにおけるn-1との間の空間に挿入されたM-1プレートは、n個を入れアイテムは、m個のグループに分け
式は
直接テンプレートコード番号の組み合わせは、最初のパラメータとすることができるMAXN、MOD、初期化のinit()関数を使用して定義され、INVが逆である、FACの階乗であり、第二の添字は、Cの指標であります
#include <cstdioを> する#include <ベクトル> の#include <アルゴリズム> の#include <入出力ストリーム> のtypedef 長い 長LL。 使用して 名前空間はstdを、 LL MOD = 1000000007 ; const int型 MAXN = 1000010 ; (LLのX LL){qpow LL LL RET = 1 。 一方、(X){ 場合(X&1 ) RET = RET *%のMOD。= A *%のMOD。 X >> = 1; } 戻りRET。 } LL FAC [MAXN]、[MAXN] INV。 LLのinit(){ FAC [ 0 ] = 1 。 以下のために(int型 iは= 1 ; I <MAXN; iは++ ) FAC [i]は = FACを[I- 1 ] * I%MOD。 INV [MAXN - 1 ] = qpow(FAC [maxn- 1 ]、mod- 2 )。 用(int型 I = maxn- 2 ; I> = 0 ; i-- ) INV [I] = INVを[I + 1 ] *(I + 1)%モッズ; リターン 0 ; } のLL C(LL N、LLのM){ 場合(N <M)戻り 0 ; 戻り FAC [n]を* INV [M]%MOD * INV [nm]の%MOD。 } LL DP1 [MAXN]、DP2 [MAXN]。 INT メイン(){ INIT()。 LL nを、X、Y。 scanf関数(" %LLD%LLD%LLD "、&N、およびX&Y)。 以下のために(int型 i = 1 ; iは、X <= N *; iは++ ) { DP1 [I] = Cの(N-(X- 1)* I- 1、I- 1 )。 } のために(int型 i = 1 ; iはYを* <= N; iは++ ) { DP2 [I] = Cの(N-(Y- 1)* I- 1、I- 1 )。 } LL ANS = 0 。 以下のために(int型 i = 1 ; iは* X <= N && iが<= N Yを*; iは++ ) ANS =(ANS + DP1 [I] * DP2 [I]%のMOD)%MOD。 printf(" %LLDする\ n " 、ANS)。 リターン 0 ; }