Round A APAC Test 2016 Problem A. Googol String
Problem
A "0/1 string" is a string in which every character is either 0 or 1. There are two operations that can be performed on a 0/1 string:
- switch: Every 0 becomes 1 and every 1 becomes 0. For example, "100" becomes "011".
- reverse: The string is reversed. For example, "100" becomes "001".
Consider this infinite sequence of 0/1 strings:
S0 = ""
S1 = "0"
S2 = "001"
S3 = "0010011"
S4 = "001001100011011"
SN = SN-1 + "0" + switch(reverse(SN-1)).
You need to figure out the Kth character of Sgoogol, where googol = 10100.
完整题目可以去别的地方找,我的解法如下:
<pre name="code" class="cpp">cin >> k;
if (!(k& k - 1))
k = 0;
else
{
while (k > 0 && ((k & 0x01) == 0))
k >>= 1;
k >>= 1;
k &= 0x01;
}
cout << k;
设位置k的字符是B[k],k从1开始
B[k]以下性质
1. 处在2次幂位置的数必定为0
2. 如果k是偶数,B[k]=B[k/2]
3. 如果k是奇数,k=2i+1,B[k]=i%2
下面简单证明下这三个性质