博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟+二分 poj-1019-Number Sequence
阅读量:5106 次
发布时间:2019-06-13

本文共 1192 字,大约阅读时间需要 3 分钟。

题目链接:

题目大意:

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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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

 

 

转载于:https://www.cnblogs.com/james1207/p/3268552.html

你可能感兴趣的文章
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
java入门
查看>>
Spring 整合 Redis
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
JSP:Cookie实现永久登录(书本案例)
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
0906第一次作业
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>