Googol字符串【Google Kickstart2015 Round A Problem A】
Googol字符串
“0/1字符串”是一个字符串,其中每个字符都是 0或 1。
有两个操作可以在 0/1字符串上执行:
switch:把 1都变为 0,0都变为 1。例如,100 变为 011。
reverse:字符串反转。 例如,100 变为 001。
考虑这个 0/1 字符串的无限序列:
S0=“”
S1=“0”
S2=“001”
S3=“0010011”
S4=“001001100011011”
…
SN=SN−1+“0”+switch(reverse(SN−1))
请你求出Sgoogol中的第K个字符,其中googol=10100。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据占一行,包含一个整数 K。
输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为 Case #x: y,其中 x
是组别编号(从 1
开始),y
是 Sgoogol
中的第 K
个字符。
数据范围
1≤T≤100
,
1≤K≤10^18
输入样例:
4
1
2
3
10
输出样例:
Case #1: 0
Case #2: 0
Case #3: 1
Case #4: 0
思路
通过把玩前三项,容易得到通式
因此,长度通式
因此,第k个数在
然后比较判断k在三部分中哪一部分递归处理就好啦(
注意标记一下是
代码
点击查看代码
#include<iostream>
#include<cmath>
typedef long long LL;
const char nl = '\n';
using namespace std;
int get(LL n,LL k,int type){
LL t = (1ll << (n - 1)) - 1;
if(k == (t + 1))return type;
else if(k <= t)return get(n - 1,k,0);
else return get(n - 1,k - t - 1,1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T;
cin >> T;
for(int i = 1; i <= T; i ++ ){
LL k;
cin >> k;
cout << "Case #" << i << ": " << get(ceil(log2(k+1)),k,0) << nl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】