题意
1,10,100,1000…组成序列1101001000…,求这个序列的第N位是0还是1。
解题思路
对于1的位置,我们可以得到序列
1,2,4,7,11,16,…
观察发现
1=1
2=1+1
4=1+1+2
7=1+1+2+3
11=1+1+2+3+4
…
我们可以得到推导公式a[n]=1+n*(n-1)/2;
所以,当输入的N是a[]序列的值时,输出为1,否则为0
逆向求解N=1+n*(n-1)/2,如果求解n为整数,则证明N是a[]序列的值
令k=sqrt(2*N-2),那么k满足n-1<=k<=n,只需要验证(k-1)*k==2*N-2或者k*(k+1)==2*N-2是否满足。
参考代码
#include <iostream>
#include <math.h>
using namespace std;
int main(){
int t,n;
cin>>t;
while (t--){
cin>>n;
int k=sqrt(2*n-2);
if ((k-1)*k==2*n-2||k*(k+1)==2*n-2)
cout<<1<<endl;
else
cout<<0<<endl;
}
return 0;
}