1087 1 10 100 1000(打表 set 数学)

Posted Veritas des Liberty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1087 1 10 100 1000(打表 set 数学)相关的知识,希望对你有一定的参考价值。

题目来源: Ural 1209
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
 收藏
 关注
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

 

刚开始想用打表的方法,但是没有写出来,后来看了别人代码,发现原来有数学规律,也有人用set来做

 

数学规律

其实是有规律的

1 = 1

2 = 1 + (1)

4 = 1 + (1+2)

7 = 1 + (1+2+3)

.....

即 X*(X-1)/2  + 1 == n有解

另t = (int)sqrt(2*n-2)  t*(t+1)==2*(n-1)成立时有解

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

int main()
{
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        int t = (int)sqrt(2*(n-1));
        if (t*(t+1) == 2*(n-1))
            printf("1\\n");
        else
            printf("0\\n");
    }

    return 0;
}

  

set

#include <bits/stdc++.h>
#define N 1000000000
using namespace std;
set<int> s;
int init(){
  s.insert(1);
  int ans=1;
  for(int i=1;ans+i<=1000000000;i++){
    s.insert(ans+i);
    ans+=i;
  }
}
int main(){
  int n;
  scanf("%d",&n);
  init();
  while(n--){
    int m;
    scanf("%d",&m);
    if(s.count(m))
      printf("1\\n");
    else
      printf("0\\n");
  }
  return 0;
}

  

打表  二分

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;

const int maxn = 100100;
int One[maxn];

void preOne()
{
    int i = 1;
    One[0] = 1;
    while (i < maxn) {
        One[i] = One[i-1]+i;
        i++;
    }

}

bool Find(int x)
{
    int l = 0, r = maxn-1, mid;
    while (l <= r) {
        mid = (l+r)>>1;
        if (One[mid] > x)
            r = mid-1;
        else if (One[mid] < x)
            l = mid+1;
        else return true;
    }
    return false;
}

int main()
{
    //freopen("1.txt", "r", stdin);
    preOne();
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        if (Find(n))
            printf("1\\n");
        else
            printf("0\\n");
    }

    return 0;
}

  

 

0

以上是关于1087 1 10 100 1000(打表 set 数学)的主要内容,如果未能解决你的问题,请参考以下文章

51NOD 1087 1 10 100 1000

1087 1 10 100 1000

51Nod-1087 1 10 100 1000模拟

[51nod] 1087 1 10 100 1000

51Nod 1087 1 10 100 1000

51Nod 1087 1 10 100 1000 | 数学