組合せ論ホップスコッチ

トピックへのリンク: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 ; 
}

 

おすすめ

転載: www.cnblogs.com/qingjiuling/p/11297207.html