「問題の解決」:順列と組み合わせ

問題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 
}
コードの表示

おすすめ

転載: www.cnblogs.com/xingmi-weiyouni/p/11617857.html