E - ローミングAtcoder

問題の解決策:https://blog.csdn.net/qq_40655981/article/details/104459253

効果の件名:n個の部屋には,,各部屋には人を持って、k個の日数の合計は、1日、人はどの部屋に行くことができます。N状態がありますどのように多くの部屋尋ねます。

皆アップN-1ベッドルームを選択するため、K場合> = N-1、結果はC(N + M-1、N-1)であり、C(N + N-1であり、ボールボックスモデルに類似していますN-1)。

kは<N-1は、確かに存在するであろう場合、N-1-kの個体は移動できません。我々は、ラインの合計は、個体は、x〜、Xと移動しない満たされていない(1、N-1-k)の条件が満たされない差し引きます。

Cは、(その後、車輪の確率は私のように、学ぶことがなかった、理解していない)(N、X)* C(N-1、X-1)の条件を満たしていない計算されます。

 

コード

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
CONST LL MOD = 1E9 + 7 
LL KSM(LL X、LLのY){ 
    LL RES = 1 一方、(Y){
         場合(Y&1)RES = RES * X%MOD。
        X = X * X%MOD。
        Y >> = 1 
    } 
    戻り RES%MOD。
} 
LL CAL(LL N、LL M){ 
    LL SUM1 = 1 
    LL SUM2 = 1 以下のための(iは= LL 1、I <= M; I ++)SUM1 = SUM1 * I%MOD。
    以下のための(iはN = LL; I> = N-M + 1 ; i--)SUM2 = SUM2を* I%MOD。
    戻り SUM2 * KSM(SUM1、mod- 2)%のMOD。
} 
int型  のmain(){ 
    LL N、K。
    CIN >> N >> K。
    もし(NK <= 1)COUT << CAL(2 * N- 1、N- 1)%のMOD << ENDL。
    { 
        LLトール = CAL(2 * N- 1、N- 1)%のMOD。
        LL TMP1CAL =(N、1)%のV。
        LL TMP 2 = 1 
        トール =(トールTMP 1 TMP 2%* V + V)%のV。
        ため(II私は= 2、I <NK; I ++ ){ 
            TMP1 = TMP1 *(N-iは、+ 1)%のV。
            TMP1 = TMP1 KSM *(I、カウンタ2)%のV。
            TMP 2 = TMP 2 *(N-I + 1)%のV。
            TMP 2 = TMP 2 KSM *(I- 1、MOD 2)%のV。
            トール =(トールTMP 1 TMP 2%* V + V)%のV。
        }
        coutの <<トール<< てendl; 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/12356882.html