BZOJ2656 [Zjoi2012】配列(シーケンス)[シミュレーション]

式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対< INTINT > 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 = 0int型の 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 }

おすすめ

転載: www.cnblogs.com/saigyouji-yuyuko/p/11456097.html