1,10,100,1000...组成序列1101001000...,求这个序列的第N位是0还是1。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
Output
共T行,如果该位是0,输出0,如果该位是1,输出1。
Input示例
3 1 2 3
Output示例
1 1 0
(考前一天一水......)
思路:
f【1】=1;
f【2】=1;
tmp=2;
我们通过观察递推发现,为1的位子是有规律的:f【i】=f【i-1】+tmp;tmp每次自增1.
那么我们预处理出所有小于等于1e9的数字为1的位子,接下来每次查询直接处理即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
ll f[1515100];
void init()
{
ll tmp=2;
f[1]=1;
f[2]=2;
for(int i=3;;i++)
{
f[i]=tmp+f[i-1];
//printf("%I64d\n",f[i]);
tmp++;
if(f[i]>1000000000)break;
}
}
int main()
{
int t;
init();
ll n;
scanf("%d",&t);
while(t--)
{
scanf("%I64d",&n);
//44722
int flag=0;
for(int i=1;i<=44722;i++)
{
if(f[i]==n)flag=1;
}
if(flag==1)
{
printf("1\n");
}
else printf("0\n");
// for(int i=3;i<=)
}
}