题目在这里:题目
这道题开始想了一种直接硬做的方式,不过发现有数据量过大会超过数据和string的范围,所以只能选择找规律。
首先,先写一段:01101001100101101001011001101001…
根据题目描述可以找到一个4个数字的循环,将这两种四个数字的组合再整合程一个新的符号组合即出现ABBABAAB,没错又是四个符号一循环的规律,那就是规律:一个二进制的递推式,那么我们只需要按照数字推回去即可
对于任何一个n来说这个规律都是成立的,所核心代码比较简单的,不过这里需要用到一个函数high_bit(我也不会,直接搞得模板,想了解的可以去搜一下),具体实现为:
long long high_bit(long long x){
x >>= 1;
x = x|(x>>1);
x = x|(x>>2);
x = x|(x>>4);
x = x|(x>>8);
x = x|(x>>16);
x = x|(x>>32);
x++;
return x;
}
有了这个就可以写完整代码,用的就是对n不断一位除数取余,知道n最后变成1或者2,这里又有一个注意的点(原题目题意给第n个数之后的‘后’字做了加粗):我们要求的是n+1,所以代码如下:
#include<bits/stdc++.h>
using namespace std;
long long high_bit(long long x){//模板。。。。。。
x >>= 1;
x = x|(x>>1);
x = x|(x>>2);
x = x|(x>>4);
x = x|(x>>8);
x = x|(x>>16);
x = x|(x>>32);
x++;
return x;
}
long long search(long long n){
if (n == 1) return 0;
if (n == 2) return 1;
long long f = high_bit(n);
if (f == n){//移位
n >>= 1;
}else{
n -= f;
}
return !search(n);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long long n;
scanf("%lld",&n);
printf("%d\n",search(n+1));
}
return 0;
}