CF-1202

http://codeforces.com/contest/1202/problem/0

wuwuwuは、最初の質問への書き込みに50分かかった2つ目の質問は読むためには良いアイデアではありません

ソリューション:

最初の質問:

問題の意味は:おそらくを2進数のF(x)は、F(y)を与える見つけることができる最小のバイナリ数kの逆の順序により形成されました

小さなここで注意:二つの数字と比較的大きなチューブの前の最初の文字から特殊文字の数を比較してから2を比較例えば、大きな桁数を必要としません:100001と110、110を超える大規模な100001

 S = F X + F Y ⋅(2 ^ k)と

アイデアが:第1クリアアイデアを処理する:K = 1、バイナリ10などのバイナリ1に2 ^ K ...(0、A k)を

バイナリ乗算:nは結果が加算されるmビットMのそれぞれであり、nが乗算されます

ここで、バイナリ明らかにのみ最初のビット'1'に2 ^ kのようにF Y ⋅(^ 2 K)=などF(Y)...(0 A K)、F(Y)= 101、K = 2101(00まで)

私たちは知っているf(x)が> F(Y)

我々はトン1トンので、最小限に最小の数を超える逆にします

乗算動作によりF(y)は、それがバックプラス0 F(X)を作ることができるので、変化の一部の背後F(Y)よりは変更することができるだけf(x)が「1」の部分の前に、Fによって(Y)* 2 ^ K '1' が0に2自体の組み合わせ

私たちは、だから我々はH1に続く「1」の数1位の最後のF(y)と0を見つける---これは確かに戻ってくると連携してf(x)が(F背後(x)は変わりません)後H2表示され、 '1' の位置を見つける(H1 + 1) - STRLEN(F(X))から

結果は、ABS(H2-H1-1)であります

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <cmath>
 4の#include <CStringの>
 5  使って 名前空間STDを、
6  の#define MAXN 100005
 7  のint main()の
 8  {
 9      int型のT。
10      のscanf(" %dの"、&T)。
11      一方(T-- ){
 12      チャーS [MAXN]、T [MAXN]。
13      CIN >> T。
14      cinを>> S。
15      int型の H1 =0、H2 = 0 16      のためには、int型 I =のSTRLEN(S) - 1 ; I> = 0 ; i-- 17      {
 18          
19          場合(S [I] == ' 1 ' 20          {
 21              ブレーク22          }
 23      }
 24      のためにINT J = STRLEN(T)-H1あり、j> = 0 ; j-- 25      {
 26          であれば(T [j] == ' 1 ' 27          {
28の              H2 =のSTRLEN(T) - J。
29              ブレーク;
30          }
 31      }
 32      COUT << ABS(H1-H2)<< ENDL。
33      }
 34   }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Aiahtwo/p/11318793.html