式I $が偶数である$で見つけることができ、この再帰は、添字の半分に低減することができ、奇数のインデックスは、二つの添え字に分割することができ、$ \ lfoorの\のFRAC {I} {2} \ rfloor $および$ \ lfoor \ FRAC {I} {2} +1 \ rfloor $。
その後、各奇数の添字は偶数奇数1に分割することができることを見出した奇数とリッピングし、その後も、2つだけの添字を与えることを半分に分割。例えば:
$ A_ {13} = 1 * A_6 + 1 *のA_7の$
$ = 1 * A_3 + 1 * A_3 + 1 *のA_4の$
$ = 2 * A_3 + 1 *のA_4の$
$ = 2 * A_1 + 2 * A_2 + 1 *のA_2の$
$ = 2 * A_1 + 3 *のA_2の$
これはおそらく、サブサブです。だから、長いレコードとしてそれぞれが出て分割2つの数字が、$ bはニーズの元の数の何を示すのにまで追加します、$
取り壊しが奇数$ $偶数、奇数$ bは$、または$ $ $ bは$であっても、2つのケースで、これが要因まで追加されますときに再び議論します。出力を停止する$ A_1 $に半減されています。
WA高精度と状況はまし。。私は良い食べ物です。WA:line31があるBN。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <cmath> 6 の#define DBG(X)CERR << #X << "=" << X <<てendl 7 使って 名前空間はstdを、 8 typedefの長い 長いLL。 9 typedefをダブルデシベル。 10のtypedef対< INT、INT > PII。 11テンプレート<型名T>インラインT _min(TA、TB){ 戻り A <Bを?:B;} 12テンプレート<型名T>インラインT _max(TA、TB){ 戻り A> B?:B;} 13テンプレート<型名T>インラインチャー MIN(T&A、TB){ 戻り A> B(A = B、?1):0 ;} 14テンプレート<型名T>インラインチャー MAX(T&A、TB) { 戻り <Bを(A = B、?1):0 ;} 15テンプレート<型名T>インラインボイド _swap(T&A、T&B){A ^ = B ^ = A ^ = B;} 16テンプレート<型名T>インラインTリード(T&X){ 17 、X = 0。int型の F = 0 ;char型の C; しばらく(isdigit(C = getchar関数())!)の場合(C == ' - ')は、f = 1 ; 18 一方(isdigit(c)参照)、X = X * 10 +(C&15)、C = GETCHAR()。返す fはX = - ?X:X; 19 } 20 のconst int型 N = 50 + 2、ベース = 1E8は、=掘る8 。 21 構造体THX { 22 INT [N]、N。 23 インラインボイド MST(){memsetの(0、はsizeofa)は、N = 1 ;} 24 THX(){MST();} 25 インラインINT&演算子 [](INT X){ 戻り}; [X] 26 インラインボイド get_num(INT)(X){MSTをN = 0。一方、(X)[++ N] = X%の塩基、X / = 塩基}; 27 インラインボイド 演算子 =(INT X){get_num(x);} 28 インラインTHXのオペレータ +(THX&ORZ){ 29 THX Bを; BN = _max(N、orz.n)。 30 のために(登録をint i = 1、B [I] + = [I] + ORZ [I]、[I + B ++ iは; iが<= BN)1 B [I] / =] 塩基を、I [B 】%= 塩基; 31 一方、(B [b.n + 1 ] && ++ BN)。// 間違い! 32 リターンB。 33 } 34 インラインボイド 演算子 + =(THX&ORZ){* この = * この + ORZ;} 35 インラインボイド オペレータ ++ (){ 36 ++ [ 1 ]。int型TMP = 1 。 37 一方([TMP] == ベース)[TMP] = 0、++ [++ TMP]。 38 一方([N + 1 ] && ++ N) 39 } 40 インラインボイドDIV2(){ 41 のため(登録INT I = N; I; - I)[I- 1 ] + =([I]&1)* ベース、[I] / = 2 ; 42 一方([N] && - N!)。もし(!N)= 1 ; 43 } 44 インラインボイドREAD(){ 45 MST()。 46 チャー S [ 300 + 7 ]; scanf関数(" %sの"、S + 1)。INT LEN = STRLEN(S + 1 )。 47 のために(登録をint i = 1 ; DIG *(I- 1 ++;)<LEN i)は 48 のために(登録INT J = 1、BAS = 1 J <= _分(DIG、lenの-DIG *(I-。1)); ++ J、BAS * = 10)[I] + =(S [lenの-DIG *(I- 1)-j + 1 ] - ' 0")* BAS; 49 のn = LEN / DIG +(LEN%DIG =!0 ); 50 } 51 インラインボイドプリント(){ 52 のprintf(" %dの" 、[N])。 53 のために(登録INT I = N- 1 ; I; - I)のprintf(" %08D " 、[I])。 54の プット("" )。 55 } 56 }ヴァル、A、B、X、Y、TMP。 57 int型T; 58 59 INTメイン(){ //freopenは( "9.in"、 "R"、STDIN); freopenは( "9.ans"、 "W"、STDOUT)。 60 リード(T)。一方、(T-- ){ 61 val.read()。 62 であれば(val.nの== 1 &&ヴァル[ 1 ] == 0){プット(" 0 ")。引き続き;} 63 ながら((ヴァル[!1 ]&1 val.div2を()))。 64 であれば(val.nの== 1 &&ヴァル[ 1 ] == 1){プット(" 1 ")。続け;} 65 val.div2(); B = A =ヴァル; ++ B; X = 1、Y = 1 。 66 ながら(!(== 1 && [ 1 ] == 1)){ // のprintf( "X =")、x.print()のprintf( "Y =")、y.print()。 67 であれば([ 1 ]&1)Y + = X、a.div2()、B =、++ B。 68 他 X + = Y、a.div2()、B =、++ B。 69 } // プット( "完了")。 70 X + = Y; x.print()。 71 } 72 リターン 0 。 73 }