質問の意味: 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 。 }