uva10706 - Number Sequence(找规律)

题目:uva10706 - Number Sequence(找规律)

题目大意:有这样一串序列11212312341234512345612345671234567812345678912345678910123456789101112345678910...,问第i个位置数的值。

1  2     3       4          5            6              7               ...

解题思路:这题需要发现规律。我一开始还看错题意了。规律是看了别人的题解才明白的。

这里定义s【i】代表第i个序列的位置。例如上面那串序列下面标的数字就代表属于哪个序列。(1序列的位置1,3序列的位置6...)

num【i】代表第i个序列的长度。注意数字10长度位2.

递推公式: s【i】 =  s【i - 1】  + s【i - 1】 - s【i - 2】 + Wi(i的位数)。

求第i序列的位置,那么就要从第i - 1序列的位置开始+序列i的长度。 s【i-1】 - s【i - 2】 :i- 1序列的位置,减去i - 2序列的位置,就是i - 1序列的长度,也就是num【i - 1】。  那么只要在i - 1序列的位置加上i - 1的长度,最后i序列的长度和i
- 1序列的长度差的就是 i的位数。

这里需要预处理数组s和num,之后的查找就是遍历这两个数组,找到相应的值。数组的大小开到1e5就可以了,已经超过2147483647了。

求第i个位置的值,那么就要先找到位于哪个序列。遍历s数组,找到s【k - 1】 <= i, 将i 减去s【k - 1】(k - 1序列的位置)就是i位置在k序列中的长度。

然后每个序列的长度也是由规律的: 序列3 :123 长度3

序列4:1234 长度4

序列i和序列i -
1相差的长度其实就是i的位数,而且又是递增的。

在num数组里面找到num【k - 1】 >= i <=num[k],那么意味着i的值就是k位数里的其中一个。

代码:

#include <stdio.h>
#include <math.h>

typedef long long ll;
const ll N = 2147483647;
const int w[] = {0, 10, 100, 1000, 10000, 100000};    //(0位1位2位...)位数分界值
const int M = 100000;
ll s[M];
ll num[M];
//预处理
void init () {

	s[0] = num[0] = 0;
	s[1] = num[1] = 1;
	int cur = 1;
	for (int i = 2; s[i - 1] < N; i++) {

		if (i >= w[cur]) cur++;
		s[i] = 2 * s[i - 1] - s[i - 2] + cur;
		num[i] = s[i] - s[i - 1];
	}
}

int main () {

	init();
	int t;
	ll n;
	scanf ("%d", &t);
	char str[10];
	while (t--) {

		scanf ("%lld", &n);
		int i;

		for (i = 1; i < M ; i++)
			if (s[i] >= n)
				break;
		n -= s[i - 1];

		for (i = 1; i < M; i++)
			if (num[i] >= n)
				break;
		n -= num[i - 1];	

		sprintf (str, "%d", i);
		printf ("%c\n", str[n - 1]);
	}
	return 0;
}

uva10706 - Number Sequence(找规律)

时间: 2024-10-09 00:50:15

uva10706 - Number Sequence(找规律)的相关文章

HDU 1005 Number Sequence (数学规律)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 104190    Accepted Submission(s): 25232 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

hdu 4952 Number Transformation (找规律)

题目链接 题意:给你个x,k次操作,对于第i次操作是:要找个nx,使得nx是>=x的最小值,且能整除i,求k次操作后的数 分析: 经过打表找规律,会发现最后的x/i,这个倍数会趋于一个固定的值,求出这个固定的值和K相乘就可以了, 为什么会趋于固定的值呢,因为最后虽然i在不断增长,但是x也是在增长的,每次的倍数会回退一个发现 有余数,然后再加上一个,所以趋于稳定. 官方题解: 1 #include <iostream> 2 #include <cstdio> 3 #includ

HDU 4279 Number(找规律)

Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4288    Accepted Submission(s): 1066 Problem Description Here are two numbers A and B (0 < A <= B). If B cannot be divisible by A, and A

【HDU 1005】Number Sequence —— 找周期

原题链接 Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 122213    Accepted Submission(s): 29653 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n

zoj 3622 Magic Number(找规律)

唉------写的相当的乱,状态十分不好. 可以求每个数前面有多少个magic number,然后相减即可. #include<iostream> #include<cmath> using namespace std; int num(int x) { int sum=0; while(x>0) { sum++; x/=10; } return sum-3; } double pow(int b) { double s=1; for(int i=1; i<=b; i+

LightOJ - 1245 Harmonic Number (II) (找规律)

题目大意:给出一个n(1 <= n < 2^31)求出H(n)的结果,H(n)的定义为下: 分析:对于一个n,设 t = n / i: 满足 t >= 1的有多少个呢? 有 n / 1 个. 满足 t >= 2的有多少个呢? 有 n / 2 个. -- 满足 t >= k的有多少个呢? 有 n / k 个. 以上结论不难发现,我们再进一步就能发现: 满足 t == 1 的有 n/1 - n/2 个 满足 t == 2 的有 n/2 - n/3 个 -- 满足 t == k 的

找规律/hdu 1005 Number Sequence

题意 给出a,b,n,已知f[1]=f[2]=1,f[i]=(a*f[i-1]+b*f[i-2]) mod 7 输出f[n] 数据范围 1 <= A, B <= 1000, 1 <= n <= 100,000,000 分析 首先,直接求..肯定是不行的 会tle 会mle 但是可以找到规律,例如对a=1,b=1 这个数据,有 f1=1 f2=1 f3=3 f4=5 f5=4 f6=0 f7=1 f8=1 f9=3 f10=5 f11=4 f12=0 ???? 我们会发现有一定的规律

uva 10706 Number Sequence(找规律)

uva 10706 Number Sequence A single positive integer iis given. Write a program to find the digit located in the position iin the sequence of number groups S1S2-Sk. Each group Skconsists of a sequence of positive integer numbers ranging from 1 to k, w

A - Number Sequence(矩阵快速幂或者找周期)

Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Each test case contains 3