模拟+二分 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 ...
随机推荐
- ajax学习笔记1
ajax是什么? ajax即“Asynchronous Javascript + XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.能够快速的从服务器获得所需数据 ...
- (一)问候Spring4
第一节:Spring 简介 Spring 作者:Rod Johnson: 官方网站:http://spring.io/ 最新开发包及文档下载地址:http://repo.springsource.or ...
- ###STL学习--标准模板库
下面进行STL的学习.希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率.下面的内容我想以知识点为总结,不再像<Effective C++>那样以章节进行总结 ...
- Python爬虫第一集
import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.read() 简单 ...
- bzoj4637:期望
思路:最小生成树计数只不过加了一个期望,由于期望具有线性性质,就可以转化为每条边的期望之和,那么一条边的期望如何求呢,在最小生成树记数中,是把相同边权的一起处理,之后把属于连通块内的点缩点,也就是说, ...
- Wix: Using Patch Creation Properties - Small Update
Source Reference: wix help document -- WiX Toolset License Using Patch Creation Properties A patch ...
- Java大数操作类
Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: packag ...
- 初识XML及简单工厂运用--网络电视精灵
网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...
- OFBiz进阶之环境搭建(eclipse)
一. 环境准备 1. jdk1.6 下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive- ...
- 关于tabBar的图片不能正常显示问题
可以先把图片的源文件的名称后面加上@2x 这种图片显示不正常问题原因可能是没有二倍图造成的!!