Luogu P1066 2 ^ kの二進数の組合せ論

二つの例:$ K | N $と$ K $の$ n $で割り切れません

Kの$場合| $、N進数は、$ $の長さを正確に$ N / k個の$ブロックに分割され、Nは-ことができ、各ブロックは異なるを満たすことができるので、したがって、数の長さは、$ Xの$ブロックである場合$ 2 ^ K-1 $番号は、その後、C_が$ {2 ^ K-1} ^ {X} $

したがって、答えは割り切れるの$ \のsum_である場合、{I = 2} ^ {N / K} \空間C_ {2 ^ K-1} ^ {I} $

$ K $は$ N- $を分割しない場合には、合計が$ \ lfloorの\のFRAC {N} {K} \ rfloor + 1 $ブロック、および最後の不完全なブロックのみ$ N \テキスト{MOD}のk $ビットとに分割します、番号を選択することができるまたは$ 0〜$ $ 2 ^ {N \テキスト{} \テキスト{MOD} \テキスト{} K} -1 $

この最上位ビットが埋め選択した場合は$ 0 $は、次に$ K戻さ| N $ \ sum_にスキーム0ここで、nは$ので、リフィルの最大数を{I = 2} ^ {\左\ lfloor \ FRAC {} {K} \右\ rfloor} C_ {2 ^ K-1} ^ {I} $

最上位ビットはまた、$ 2 ^ {n個\テキスト{} \テキスト{MOD} \テキスト{}のk} -1 $に$ 1 $を埋めることの後に我々は$ I $を埋めるために選択した場合、次のブロックが$以上を埋めるために私は、プログラム番号が左$ C_ {2 ^ K-1-I} ^ {\であるので、各ブロックが残り$ 2 ^ K 1-I- $数を満たすことができる、多数の$ \ lfloor \ FRAC {n}は{K} \右\ rfloor} $

したがって、最終的な答えはまた、$ \ sum_ {i = 1} ^ {2 ^ {N \テキスト{} \テキスト{MOD} \テキスト{}、K} \空間\空間\空間-1} \空間C_を{追加する必要があり2 ^ K-1-I} ^ {\左\ lfloor \ FRAC {n}は{K} \右\ rfloor} $

#include <cstdioを> 
する#include <iostreamの> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <CCTYPE> 
の#include <cstdlib> 
の#include <ベクトル> 
の#include <地図> 
の#include < 設定 >
 #defineっ長い長
 の#define RレジスタINT
 静的 チャーのB [ 1 << 15 ]、* S = B * D = B。
#define GETCHAR()(S == D &&(D =(S = B)+関数fread(B、1,1 << 15、STDIN)、S == D)EOF:* S ++)
 使用して 名前空間STDを、int型G(){ 
    RのRET = 0、=解決1登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。
    DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。
} 短い C [ 210 ]。INTのN、K、P、RES、T。
インライン文字列を追加(文字列文字列B){ 
    Rのレナ= a.size()、LENB = b.size()。逆(a.begin()、a.end())、逆(b.begin()、b.end())。memset(C、0はsizeof (c)参照)。
    R P = 0(; P <MAX(レナ、LENB)|| C [P]; ++ p)はC [P] + =(INT)(P <レナ?10)*([P] - 48)+ (INT)(P <LENB?10)*(B [P] - 48)、C [P + 1 ] + = C [P] / 10、C [P]%= 10 文字列 RET = " \ 0 " ; (R I = P- 1 ;〜I; - I)ret.insert(ret.end()、CHAR(C [i]が+ 48 ))。
    逆(a.begin()、a.end())、逆(b.begin()、b.end())。リターンRET; 
} 
文字列ANS。
 C [ 512 ] [ 512 ]。
署名されたメイン(){ 
    K = G()、N = G()、P = N / K、RES = N%のK。
    T =(1 << k)を- 1、C [ 0 ] [ 0 ] = " 1 " (R I = 1 ; I <= T; ++ I){C [i]が[ 0 ] = " 1 " 以下のための(R J =1、J <I; ++ j)はC [I] [J] =(C [1-追加1 ] [J]、C [I- 1 ] [J- 1 ])。C [i]は[I] = " 1 " 
    } のための(R I = 2 ; I <= P; ++ I){
         場合(I> T)、ブレークANS = 追加(ANS、C [T] [I])。
    } R LIM =(1つの << RES) - 1 (R I = 1 ; I <= LIM; ++ I){
         場合(P> TI)ブレークANS =(ANS、Cを[T-追加i]が[P])。
    } COUT << ANS << ENDL。
}

2019年6月5日

おすすめ

転載: www.cnblogs.com/Jackpei/p/10979764.html