二つの例:$ 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 <レナ?1:0)*([P] - 48)+ (INT)(P <LENB?1:0)*(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日