【数学+二分】无穷的序列(seq)

  无穷的序列(seq)

问题描述】

有一个无穷序列如下:

110100100010000100000…

请你找出这个无穷序列中指定位置上的数字

【输入】

第一行一个正整数N,表示询问次数;

接下来的N行每行一个正整数Ai,Ai表示在序列中的位置。

【输出】

N行,每行为0或l,表示序列第Ai位上的数字。

【输入样例】

4

3

14

7

6

【输出样例】

0

0

1

0

【数据范围】

对于100%的数据有N≤1500000,Ai≤10^9

=========================

==================

{
ID:jie19952
PROG:
LANG:PASCAL
}
var
  a:array[0..89443]of longint;
  sum:array[0..89443]of longint;
  n:longint;
procedure init;
begin
  assign(input,'seq.in');
  assign(output,'seq.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

function find(x:longint):boolean;
var
  l,r,m:longint;
begin
  find:=false;
  l:=1; r:=89443;
  while l<=r do
    begin
      m:=(l+r) shr 1;
      if sum[m]>x then r:=m-1
      else if sum[m]<x then l:=m+1
                       else exit(true);
    end;
end;

procedure main;
var
  i:longint;
  x:longint;
begin
  sum[0]:=1;
  sum[1]:=2;
  a[1]:=1;
  a[0]:=0;
  for i:=2 to 89443 do
    begin
      a[i]:=a[i-1]+1;
      sum[i]:=sum[i-1]+a[i];
    end;
  readln(n);
  for i:=1 to n do
    begin
      read(x);
      if find(x) then writeln(1)
                 else writeln(0);
    end;
end;

begin
  init;
  main;
  terminate;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值