CodeVS1280 无限序列
2015-09-20 12:36
246 查看
http://codevs.cn/problem/1280/
题意:有一个无限序列:123456789101112……问第Ai位是什么数字。
线性的模拟会超时,因为这里的序列很有规律,所以可以考虑用数学方法来计算。
序列是由每个正整数依次连接的,但是正整数的位数有所不同,无法统一计算,因此应该先观察Ai位对应的正整数是几位的。
可以预先处理好小于某10的幂的所有正整数位数之和t[],以便根据的Ai和t[]大小关系来快速检索相应的位数。
得到位数后,根据Ai和t[]的差整除位数的结果计算出实际数字在当前位数的全部数字中的排名,并得到实际数字。
再根据Ai和t[]的差对位数取模的结果计算出第Ai位是实际数字中的第几位。
最后直接从实际数字中取出该位即可。
代码:
题意:有一个无限序列:123456789101112……问第Ai位是什么数字。
线性的模拟会超时,因为这里的序列很有规律,所以可以考虑用数学方法来计算。
序列是由每个正整数依次连接的,但是正整数的位数有所不同,无法统一计算,因此应该先观察Ai位对应的正整数是几位的。
可以预先处理好小于某10的幂的所有正整数位数之和t[],以便根据的Ai和t[]大小关系来快速检索相应的位数。
得到位数后,根据Ai和t[]的差整除位数的结果计算出实际数字在当前位数的全部数字中的排名,并得到实际数字。
再根据Ai和t[]的差对位数取模的结果计算出第Ai位是实际数字中的第几位。
最后直接从实际数字中取出该位即可。
代码:
var a:array[0..14]of qword; t:array[0..15]of qword; n,i,j,ii:longint; k,x:qword; begin t[0]:=1; for i:=1 to 15 do t[i]:=t[i-1]*10; a[0]:=0; for i:=1 to 14 do a[i]:=a[i-1]+9*t[i-1]*i; readln(n); for i:=1 to n do begin readln(k); if k<10 then begin writeln(k); break; end; for j:=14 downto 0 do if a[j]<k then break; x:=(k-a[j]-1) div (j+1)+t[j]; for ii:=1 to j-(k-a[j]-1) mod (j+1) do x:=x div 10; writeln(x mod 10); end; end.
相关文章推荐
- oracle常用函数及示例
- 大龄屌丝自学笔记--Java零基础到菜鸟--020
- httpd-2.2相关知识总结
- 第三周项目4 顺序表应用(1)
- 中文宾州树库标记含义
- Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)
- Android 属性动画(二):ObjectAnimator与ValueAnimator
- c++中的时间戳
- 逻辑与’&&’和逻辑或’||’的陷阱
- 猴子吃桃两种方法
- J2SE小结
- Activiti入门教程五(详解ProcessEngine的创建)
- Mybatis使用Redis二级缓存
- C中的+0与-0
- 用position:relative和float实现不定宽块级元素的居中
- 分析灰盒测试优点和缺点
- 第三周项目1 顺序表的基本运算(3)
- ROS探索总结(十七)——构建完整的机器人应用系统
- 怎样取整
- c中const和c++中const的学习总结