模拟+二分 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 ...
随机推荐
- Android Metro风格的Launcher开发系列第二篇
前言: 各位小伙伴们请原谅我隔了这么久才开始写这一系列的第二篇博客,没办法忙新产品发布,好了废话不说了,先回顾一下:在我的上一篇博客http://www.cnblogs.com/2010wuhao/p ...
- 第一篇、C_高精度加法
简介: C语言中,整型占4字节,现在要计算两个100(假设)位以内的数想加,如果只是用整型去存储,明显就会越界.那么,我们有什么好的方法去完成这一操作呢? 1.用数组实现 数组中可以可以存储一定长度的 ...
- ERROR ITMS-90049错误解决
检查一下项目有集成友盟,shareSDK这种第三方包,里面有个腾讯bundle,包含了一个Info.plist. 去掉,就可以了.类似有其他第三方的bundle,可能也会出现这个问题. 原因估计是Ap ...
- post 提交数据
1 默认:application/x-www-form-urlencoded 在网页表单中可设置 enctype的值,如果不设,默认是 application/x-www-form-urlencode ...
- sgu 110 Dungeon
这道题是计算几何,这是写的第一道计算几何,主要是难在如何求入射光线的反射光线. 我们可以用入射光线 - 入射光线在法线(交点到圆心的向量)上的投影*2 来计算反射光线,自己画一个图,非常清晰明了. 具 ...
- java 的输入/输出
java 的输入/输出 java的 I/O是通过java.io包下的类和接口支持, 其中最重要的是5个类,分别是 File,OutputStream,InputStream, Write,Reader ...
- c#基础知识对比(面向对象)
private,protected,public和internal private:是完全私有的,只有本类自己能用[好比自己的老婆,只有你自己可以调用,其他谁都不可以] protected:可被外界看 ...
- 如何更改Chrome默认的搜索引擎
1 打开Chrome浏览器之后,点击窗口右上角的图标,在弹出的菜单中点击设置,如图所示: 2 在打开的窗口中,点击管理搜索引擎,如下图所示: 3 在弹出的窗口中,找到百度的搜索引擎或者bing的搜索 ...
- lispbox 安装运行.sh的时候出现 lispbox.sh: 2: lispbox.sh: Bad substitution
安装lispbox时使用tar命令将压缩文件解压之后cd进入之后在运行.sh文件时出现了如下情况. $ sh lispbox.sh lispbox.: lispbox.sh: Bad substitu ...
- python zookeeper 学习笔记
1.安装zookeeper 下载zookeeper后,解压,安装 cd zookeeper-/src/c ./configure make make install 2.启动zookeeper服务 c ...