模拟+二分 poj-1019-Number Sequence
题目链接:
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的更多相关文章
- Poj 1019 Number Sequence( 数据分析和操作)
一.题目大意 有这样一个序列包含S1,S2,S3...SK,每一个Si包括整数1到 i.求在这个序列中给定的整数n为下标的数. 例如,前80位为1121231234123451234561234567 ...
- poj 1019 Number Sequence 【组合数学+数字x的位宽函数】
题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total ...
- POJ 1019 Number Sequence
找规律,先找属于第几个循环,再找属于第几个数的第几位...... Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- POJ 1019 Number Sequence 解读
这是一个看似简单,其实很难受. 本来我想发挥它的标题轨道基础.没想到反被消遣-_-|||. 看它在个人基础上,良好的数学就干脆点,但由于过于频繁,需求将被纳入全,因此,应该难度4星以上. 方法就是直接 ...
- POJ - 1019 Number Sequence (思维)
https://vjudge.net/problem/POJ-1019 题意 给一串1 12 123 1234 12345 123456 1234567 12345678 123456789 1234 ...
- PKU 1019 Number Sequence(模拟,思维)
题目 以下思路参考自discuss:http://poj.org/showmessage?message_id=176353 /*我的思路: 1.将长串数分成一个个部分,每个部分是从1到x的无重复的数 ...
- POJ 1019:Number Sequence 二分查找
Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36013 Accepted: 10409 ...
- 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 ...
- HDU 1005 Number Sequence (模拟)
题目链接 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f( ...
- HDU 1005 Number Sequence
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
随机推荐
- oracle 12 C启动问题
启动时出现以下报错信息: SQL> startup; ORA-48146: missing read, write, or exec permission on directory during ...
- 用pelican搭建完美博客
前面有文章介绍本站采用了Python编写的Pelican静态生成博客系统, 之所以没有使用当前很火的Jekyll, 是因为它是Ruby编写, 而我又对Ruby没有啥兴趣, 所以还是选择了使用了我熟悉的 ...
- 如何一行jquery代码写出tab标签页(链式操作)
啦啦!今天又学了一招,js写几十行的tab标签页jquery写一行就行啦,用到了链式操作!以下是代码: <!DOCTYPE html> <html lang="en&quo ...
- Linux操作系统是如何工作的?破解操作系统的奥秘
学号:SA12**6112 研究笔记: 1:计算机是怎么样工作的 2:用户态到内核态切换之奥秘解析 3:进程切换之奥秘解析 本博文主要是根据前3篇笔记来总结Linux内核的工作机制. 一:操作系统工作 ...
- SVN查看提交日志的命令
Windows下,使用svn客户端查看日志很方便,但是如果在linux下,常规查看日志的命令对于日志记录数比较多的时候,屏幕显示不了,就比较麻烦,后来发现了一个很有用的参数可以限制要查看的记录条数 查 ...
- JQuery中的动画
一.show()方法和hide()方法 这两种方法是jQuery动画的最基本方法.当为元素调用show方法时相当于将该元素的display样式改为block或者inline,同理,如果当元素调用hid ...
- 要做一款APP-解放双手
对方打字或发语音,我可以选择看屏幕或者听. 我说话,能够转化为文字.不需要点击开始按钮的那种.
- ubuntu14.04配置lnmp
看到了一片讲解ubuntu下安装lnmp的文章,跟着一步步的来,竟然很顺利的成功了,将文章复制如下,原著勿怪 一.操作步骤 1.安装Nginx sudo apt-get install update ...
- 《编写高质量代码:改善Python程序的91个建议》读后感
编写高质量代码:改善Python程序的91个建议 http://book.douban.com/subject/25910544/ 1.(建议16)is 用于判断两个对象的id是否相等,==才是判断 ...
- This transaction has been rolled back, rather than only the current.
今天上午,收到运维组同事反映某应用系统的其中一个功能报错,不是偶然性事件,每个使用该功能的用户都报错.报错内容为:This transaction has been rolled back, rath ...