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
李陶冶
(题目提供者)
不难发现1的位置分别在: 1 2 4 7 11 16
减去1以后他们的位置分别是:0 1 3 6 10 15
可以发现后面是一个等差数列求和后的结果。
对第一个位置特判,其它位置的数据进行解方程 x^2+x-2(n-1)=0
如果解出来的较大值是一个整数,那么第n位就是1了。
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==1) {printf("1\n"); continue;}
double ans=(sqrt(8*(n-1)+1)-1)/2;
printf("%d\n",ans==(int)ans?1:0);
}
return 0;
}