牛オフNOIPのサマーキャンプ7日 - グループ6Cを改善するために:配置の問題(組み合わせ数)

質問の意味: N個体のクラス、BクラスMは個人持ち、今それぞれがABクラスから人々の数が同じで描かれた、公平であるために、新しいクラスCクラスを構成しています。これで、すべてのオプション、およびどのように多くの数を見つけます。

アイデア:それは* C(N、KΣkを求めている )* C(M、K) の生成物および需要方法を確認するために第一の外側層k、2つの数の組み合わせを無視します。 

明らかΣC(N、K)* C(M、K)= C(N + M、N)C(N、K)= C(N、NK)として; Nは、NK数として選択することができ、 M kの選択、組み合わせの数ようにします。

今、このKに対処する方法を見て。K * C(N、K)= N * C(N-1、K-1)注目;彼らはに係合することができる:Σkの* C(N、K)* C(M、K)=ΣN * C (N-1、K-1)* C(M、K)= C(N + M-1、N-1)。

ルーカスはそれを行います。

<ビット/ STDC ++ H>の#include
 の#defineは長い長いっ
 の#define REPは(iは、、B)のための式(I ++; iが= Bを<Iは= INT)
 使用して 名前空間STDを、
const  int型のMod = 19260817 ;
const  int型 MAXN = 19260817 ;
INT F [MAXN]、[MAXN] revは。
INT qpow(INT A、INT X){
     int型 RES = 1一方、{(x)の
         場合(X&1)RES = 1LL *解像度*%のMod。
        X >> = 1= 1LL * *%のMod。
    }リターンのres; 
} 
ボイドのinit()
{ 
    F [ 0 ] = revが[ 0 ] = 1 
    担当者(I、1、maxn- 1)F [I] = 1LL * F [I- 1 ] * I%のMod。
    REV [MAXN - 1 ] = qpow([maxn- F 1 ]、Mod- 2 )。
    int型 I = maxn- 2 ; I> = 1 [I + [I] = 1LLの*の回転吹け; i--)1 ] *(I + 1)%のMod。
} 
INT C(INT N、INTもし M)
{
     M)。(N <M)戻り 0 ;
    戻り 1LL * F [N] * REV [M]%モジュレーション*のREV [NM]%のMod。
} 
INT ルーカス(LL N、LLのM)
{ 
    場合(M == 0リターン 1 戻り 1LL *ルーカス(N / MOD、M / MOD)* C(N%MOD、M%のMOD)%のModと、
} 
int型のmain()
{ 
    INIT()。
    int型T; LL N、M。
    scanf関数(" %のD "、&T)。
    一方、(T-- ){ 
        scanf関数(" %のLLDの%のLLD "、&​​N、&
        のprintf("%Dを\ n "、2LL * Mの%モジュレーション*ルーカス(N + M- 1、N- 1)%MOD)。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/hua-dong/p/11429765.html