今天周六,偷个懒选了个非常easy 的题目 题目: 有一个字符串S,下标从1开始,初始为S=“0”。现在开始调用fun函数。

{
    for(i=0;i<100000;i++)
    {
        tmp=change(S);
       
        S=S+"0"+tmp;
    }
}
change(s)
{
    for(i=1;i<=s.length();i++)
    {
        if(s[i]=='0')s[i]='1';
        else s[i]='0';
    }
 
    i=1;
    j=s.length();
 
    while(i<=j)
    {
        tmp=s[i];
        s[i]=s[j];
        s[j]=tmp;
        i++;
        j--;
    }
    return s;
} 

现在有若干个查询,每一个查询有一个整数n,我们想知道字符串S第n位是什么。 解法: 通过找规律可以找到串是在每个2^n的地方都反对称的,所以进行递归进行处理即 可,2^n的位置即为0 代码:

#include<cmath>
#include<algorithm>
using namespace std;
int solve(long long a, int flag)
{
    if(a <= 3)
    {
        if(a == 3)
            return abs(1 - flag);
        else
            return abs(0 - flag);
    }
    else
    {
        //printf("a  %lld\n", a);
        int i = 0;
        long long p = a;
        while(p != 1){
            p /= 2;
            i++;
        }
        long long now = 1;
        while(i--)
            now *= 2;
        if(now == a)
            return abs(0-flag);
        flag = abs(1 - flag);
        return solve(2 * now - a,flag);
    }
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        long long a;
        scanf("%lld", &a);
        printf("%d\n", solve(a,0));
    }
    return 0;
}