uva 10706 Number Sequence(数学规律)
题目大意:有一个有0 ~ 9组成的序列,1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 。。。。就是第一位为1. 第二为为1 ,第三为为2, 然后10 的部分注意下, 为1 和0 两个, 100 就是1 , 0和0 三位,以此类推, 要求给出tmp, 输出序列中的tmp位为什么数字。
解题思路:数据很大,肯定不能模拟,找规律。
这两个是为推出来的用来打表的公式:
1、sum[i] = sum[i - 1] * 2 - sum[i - 2] + w (w为当前i 的位数, sum[i]表示当前数字出现到i的时候占到序列的第几位)。
公式可以看成两部分, sum[i - 1] 和sum[i - 1] - sum[i - 2] + w.
sum[i - 1] 很明显是i - 1出现时所到达的位数, 那么开始生成i的时候,肯定是由sum[i - 1]这里开始的。
sum[i - 1] - sum[i - 2] + w就是从1 ~i所需要的位数, sum[i - 2] 为生成到i - 2所需要的个数,那么sum[i - 1] - sum[i - 2] 就为1 ~ i-1所需要的位数, 生成i - 1 和生成i只差了一个i,所以加上i的位数 就可以了。
2、num[i] = sum[i] - sum[i - 1],(num[i]为生成到i所需要的位数, 上面讲过了)
然后遍历一边sum数组, 找到第一个使得sum[i] >= tmp的i, 也就是说, tmp位的数是在生成1 ~i的过程中产生的数, 所以问题可以转换成找生成1 ~ i过程中的tmp - sum[i - 1]位。
接下来遍历一遍num数组,找到第一个i使得num[i] >= tmp的i, 也就是说, 处理过的tmp是在生成i的过程中产生的数,
输出tmp - num[i - 1]位与数i对应的位数值。
#include <stdio.h>
#include <stdlib.h>
const int N = 350000;
const int MAX = 2147483647;
const int w[] = {0, 10, 100, 1000, 10000, 100000}; int n = 2, num[N];
long long sum[N]; void init() {
sum[0] = num[0] = 0, sum[1] = num[1] = 1;
for (int cur = 1; sum[n - 1] < MAX; n++) {
if (n >= w[cur]) cur++;
sum[n] = sum[n - 1] * 2 - sum[n - 2] + cur;
num[n] = sum[n] - sum[n - 1];
}
} int main () {
init();
int cas, tmp, cur;
char str[10];
scanf("%d", &cas);
while (cas--) {
scanf("%d", &tmp);
for (cur = 1; cur < n; cur++)
if(tmp <= sum[cur]) break;
tmp -= sum[cur - 1];
for (cur = 1; cur < n; cur++)
if (tmp <= num[cur]) break;
tmp -= num[cur - 1];
sprintf(str, "%d", cur);
printf("%c\n", str[--tmp]);
}
return 0;
}
uva 10706 Number Sequence(数学规律)的更多相关文章
- UVA 10706 Number Sequence (找规律 + 打表 + 查找)
Problem B Number Sequence Input: standard input Output: standard output Time Limit: 1 second A singl ...
- UVa 10706 - Number Sequence
题目大意:Sk表示从1到k的字符序列,如S4为1234,现如今有如下的序列S1S2...Sk,形如1 12 123 1234这样的序列,给一个数n,让你去这个序列第n个位置上的数字. 可以构建出一个S ...
- PAT甲级——1104 Sum of Number Segments (数学规律、自动转型)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90486252 1104 Sum of Number Segmen ...
- 1005:Number Sequence(hdu,数学规律题)
Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...
- HDU1005 Number Sequence(找规律,周期是变化的)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/O ...
- 递推:Number Sequence(mod找规律)
解题心得: 1.对于数据很大,很可怕,不可能用常规手段算出最后的值在进行mod的时候,可以思考找规律. 2.找规律时不必用手算(我傻,用手算了好久).直接先找前100项进行mod打一个表出来,直接看就 ...
- HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- UVA - 10689 Yet another Number Sequence 矩阵快速幂
Yet another Number Sequence Let’s define another number sequence, given by the foll ...
- 数学: HDU1005 Number Sequence
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- 3D objects key rendering steps
Key steps of Rendering objects: 1 Create objects’ meshes, which we can use C++’s vector container to ...
- 关于bootstrap--排版(标题、强调、背景、插入符等)
1. 2.标题:<h1>这是主标题<small>这是副标题,为当前字号65%,灰色(#999)</small></h1>. 3.段落:<p> ...
- sql获取每门课程成绩最好的学生信息
1.相关数据表 Score表 [User]表 SQL语句例如以下: --查询出各科成绩最好的学生信息 --自连接 --SELECT TOP 1 * FROM Score B WHERE B.Score ...
- Cocos2d-x学习笔记(3)
Cocos2d-x有一个包括全部其它头文件的cocos2d.h,仅仅要在使用时包括这个头文件,就能够使用引擎的全部功能.Cocos2d-x的类都放置于cocos2d的命名空间下,如引擎下的" ...
- Android模仿jquery异步请求
01 package com.xbl.task; 02 03 import java.io.BufferedReader; 04 import java.io.InputStream; 05 im ...
- Unity 对象池的使用
在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的 ...
- linux加入windows域之完美方案(转载)
概念理解:1.kdc:可信任的密钥分发中心(KDC, Key Distribution Center).2.Winbind是Samba套件的功能之一.它允许Unix系统利用Windows NT的用户帐 ...
- transition过渡的趣玩
本例中将三张图(来自网络)进行堆叠,鼠标悬停触发.附有源代码
- 页面全屏显示JS代码
1.直接在页面加载时就全屏. <body onload="window.open(document.location,'big','fullscreen=yes'):window.cl ...
- Protobuf, understand the hood
proto文件定义 package lm; message Foo{ required int32 id = 1; } message Bar{ required int32 id = 1 [defa ...