题目描述
有一个无穷序列如下:
110100100010000100000…
请你找出这个无穷序列中指定位置上的数字
输入输出格式
输入格式:
第一行一个正整数N,表示询问次数;
接下来的N行每行一个正整数Ai,Ai表示在序列中的位置。
输出格式:
N行,每行为0或1,表示序列第Ai位上的数字。
说明
对于100%的数据有N≤1500000,Ai≤10^9
解析:
看到本题的第一眼,我就想起了初中数学老师给我们讲的无穷小数的三种类型。
其中一种叫构造型,如0.101001000100001…
本题也是一样的 每两个1之间先是隔了零个0,然后是1个0,然后是2个0,然后…
序列问题分析清楚了,剩下的就是数据范围问题了,要知道,一个10^9的数组可是会爆掉的
那该怎么办呢?
于是有了以下做法:
暴力算法:枚举与二分
先求出序列内所有值为 1 的位置
再进行二分查找所问位置是否为1
scanf("%d",&n);
a[1]=1;//序列中第 i 个 1 的位置
a[0]=1;//序列中 1 的个数
for(int i=2;i<1e9+10;i+=cnt)
{
cnt++;//间隔
a[++a[0]]=i;