题目链接:

http://poj.org/problem?id=1019

题目大意:

Sk表示123...k

把S1S2S3...Sk排成一行 比如:112123123412345123456....

求第i个数字是多少。

解题思路:

如果Sk表示123...k所占的位数,显然Sk=Sk-1+Cal(k)。Cal(k)表示k的位数。

先打表预处理sum[i]=S1+S2+..+Si;

然后在sum[i]中查找第n个属于哪一个Sk.

在同一个Sk中,一位有1~9 9个,2位有10~99 90个   3位有100~999 900个。。。所以可以先找到属于该Sk中的第几位的数。

找到位数后,就可以算出属于该位的第几个数了  比如四位的第一个数1000,第二个数为1001,,,

找到该位数的第几个后,再找属于该数的第几位,比如1234的第二位是2.

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
ll Cal(ll k) //计算k的位数
{
ll res=0;
while(k)
{
res++;
k/=10;
}
return res;
}
ll cnt[33000]; //cnt[i]表示S1S2...Si的总位数
ll bitcnt[20]; //在一个Si中,bitcnt[i]表示1~i位总共的个数
ll shi[12]; //shi[i]表示10^(i-1); int fun(int x,int num) //计算x的第num位数字
{
int res=0,temp=x;
while(temp)
{
res++;
temp/=10;
}
res=res-num+1;
for(int i=1;i<res;i++)
x/=10;
return x%10;
}
int main()
{
ll lim=2147483647LL; //打表预处理
cnt[1]=1;
ll la=1;
for(int k=2;cnt[k-1]<=lim;k++)
{
la=la+Cal(k); // Sk=S(k-1)+k的位数
cnt[k]=cnt[k-1]+la;
}
int up=31268; //计算知k最大为31268 bitcnt[1]=9;
la=1;
for(int i=2;i<10;i++) //计算1~i位总的个数 1 有9个 2位有90个 3位有900个
{
la*=10;
bitcnt[i]=bitcnt[i-1]+la*9*i;
}
shi[1]=1;
for(int i=2;i<=10;i++)
shi[i]=shi[i-1]*10; ll n;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%I64d",&n);
int k=lower_bound(cnt+1,cnt+up+1,n)-cnt; //求出是属于第k个数中
int gap=n-cnt[k-1]; //中间差多少位
int bb=lower_bound(bitcnt+1,bitcnt+9+1,gap)-bitcnt;//算出数位
gap-=bitcnt[bb-1];//算出是该数位的第几个数
int a=(gap%bb)?(gap/bb+1):(gap/bb); //表示第几个
int b=gap%bb; //表示是该数的第几位
if(b==0)
b+=bb;
printf("%d\n",fun(shi[bb]-1+a,b));
}
return 0;
}

模拟+二分 poj-1019-Number Sequence的更多相关文章

  1. Poj 1019 Number Sequence( 数据分析和操作)

    一.题目大意 有这样一个序列包含S1,S2,S3...SK,每一个Si包括整数1到 i.求在这个序列中给定的整数n为下标的数. 例如,前80位为1121231234123451234561234567 ...

  2. poj 1019 Number Sequence 【组合数学+数字x的位宽函数】

    题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total ...

  3. POJ 1019 Number Sequence

    找规律,先找属于第几个循环,再找属于第几个数的第几位...... Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submi ...

  4. POJ 1019 Number Sequence 解读

    这是一个看似简单,其实很难受. 本来我想发挥它的标题轨道基础.没想到反被消遣-_-|||. 看它在个人基础上,良好的数学就干脆点,但由于过于频繁,需求将被纳入全,因此,应该难度4星以上. 方法就是直接 ...

  5. POJ - 1019 Number Sequence (思维)

    https://vjudge.net/problem/POJ-1019 题意 给一串1 12 123 1234 12345 123456 1234567 12345678 123456789 1234 ...

  6. PKU 1019 Number Sequence(模拟,思维)

    题目 以下思路参考自discuss:http://poj.org/showmessage?message_id=176353 /*我的思路: 1.将长串数分成一个个部分,每个部分是从1到x的无重复的数 ...

  7. POJ 1019:Number Sequence 二分查找

    Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36013   Accepted: 10409 ...

  8. HDU1005 Number Sequence (奇技淫巧模拟)

    A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...

  9. HDU 1005 Number Sequence (模拟)

    题目链接 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f( ...

  10. HDU 1005 Number Sequence

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

随机推荐

  1. ###再探Makefile

    使用makefile.以前刚开始接触Makefile的时候,写过一个最简单的Makefile.点击查看Evernote原文. #@author: gr #@date: 2014-07-20 #@ema ...

  2. ###STL学习--标准模板库

    下面进行STL的学习.希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率.下面的内容我想以知识点为总结,不再像<Effective C++>那样以章节进行总结 ...

  3. android开发 单击按钮 实现页面间的跳转

    我的MainActivity.java部分代码 public class MainActivity extends ActionBarActivity { //不要定义button类型,会出错 Vie ...

  4. Android NDK 环境搭建 + 测试例程

    懒得废话一大堆概念,关于ADT.NDK的概念要是你不懂,怎么会搜到这里来?所以你只需要根据下面的步骤来,就可以完成NDK环境搭建了. 步骤:(假设你未安装任何相关开发工具,如果已经安装了,就可以跳过) ...

  5. linux共享文件samba安装与java读取外部文件夹方法

    测试环境RedHat 6.4 一.安装 samba组件安装: (1)首先用“rpm –qa |grep samba”命令检验系统samba服务是否安装. #rpm –qa |grep samba sa ...

  6. Blu-Ray BRRip 和 BDRip 的区别

    Blu-Ray BRRip & BDRip 的区别 最近看电影有点多,常常看到blueray或者BDRip的格式,所以找了一下这两种格式的区别. BRRip = 来自蓝光盘片的xvid编码 B ...

  7. jquery ajax php+mysql 无刷新分页 详细实例

    最近在接触jquery和ajax,当前项目也会用到分页,为了用户体验更好一些,就准备用无刷新分页,这个demo很适合新手学习查看,写的比较清晰,话不多说,直接上代码吧. 首先是html页面,index ...

  8. LESS语法备忘

    变量 很容易理解: @nice-blue: #5B83AD; @light-blue: @nice-blue + #111; #header { color: @light-blue; } 输出: # ...

  9. ASP.NET Core 行军记 -----第一步(艰辛的 MVC Hello World)

    现在ASP.NET Core还在不断成长.更新中,说不定到了明天又换了个模样,就如同一个小孩,从蹒跚学步,到奔向未来. 所以我们可以相应的去理解更新中所发生的变化,包容它.呵护它,而不是盲目的指责与批 ...

  10. building Utils {{ant+ivy}、{maven}}怎么样手动将下载下来的 JAR 包添加到 Maven、ivy 的本地仓库

    mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面 ...