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 }