問題B:順列
制限時間:1秒 メモリ制限:256メガバイト
フェイス質問
彼は公に質問に直面して減少しました。
問題の解決策
$ C_N ^ I $は$ C_N ^ {NI} $に変換することができ、私もこの小さな変革について考えたくなかった......
1E9は投げ屋上に李ルルなることを恐れてではありません。
柿意義を考える:$ \和\ limits_ {i = 0} ^ nC_n ^ i *がC_N ^ {NI} $が内部2NのNの群から選択された要素として解釈することができる......
そして、それは終わりました。$ C_ {2N} ^ nは$、階乗直接および逆プレイテーブル。複雑さ:$ O(N + T)$。
コード:
#include <ビット/ STDC ++ H> の#defineが長い長いちゃう の#define RINTレジスタintは #DEFINE読み出す(A)A = INIT() の#define MOD十億七 使用 名前空間STDを、 インラインint型のinit() { RINTのA = 0、B = 1 ;登録CHAR CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')B = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){A =(<< 3)+(<< 1)+ CH- ' 0 ' ; CH = GETCHAR();} 戻り *のB。 } int型T、N。 LLのINV [ 2000006 ]、FAC [ 2000006 ]、facinv [ 2000006 ]。 インラインボイドGETC() { INV [ 0 ] = INVを[ 1 ] = FAC [ 0 ] = facinv [ 0 ] = 1 ; 用(RINT I = 2 ; I <=2000000 ; ++ I) INV [I] =(MOD-MOD / I)* INV [MOD%のI]%MOD。 用(RINT i = 1 ; iが= < 2000000を ; ++ i)が { FAC [i]は = FAC [I- 1 ] * I%MOD。 facinv [I] = facinv [I- 1 ] * INV [I]%MOD。 } を返します。 } インラインのLL C(RINTのX、RINTのY){ 戻り FAC [X] * facinv [XY]%MOD * facinv [Y]%のMOD;} int型のmain() { (T)を読み出す; GETC()。 一方のprintf({読み取り(N) - (T)" %LLDする\ n "、C(2 * X、X));} 戻り 0 。 }