UVa 1583打表

背景:1--TLE:超时,没有考虑到时间复杂度,开始对每一个数都从1开始到99999,这样就是O(t*key)这样20组大数就可以超时。2--WA:3--WA都是把数字误以为最多4位了,其实是五位!!!。

思路:找出i(从1到100000)产生的数n,i是n的生成元,由于最多5位数字相加,所以n-i<50.对于每个要找生成元的数t,如果t大于50,只需搜索(t-50,t)。

学习:1.对于所有情况最多10万级别的可以打表。

#include<stdio.h>
int str[99999];
int main(void){
	  str[0]=0;
	  for(int i=1;i<99999;i++){
	  	int temp=i;
	  	str[i]=i;
	  	for(int j=0;j<5;j++){
	  		str[i]+=temp%10;
	  		temp/=10;
	  	}
	  }
	  int t;
	  scanf("%d",&t);
	  while(t--){
	  	int key,judege=0;
	  	scanf("%d",&key);
	  	for(int i=1;i<99999;i++){
	  		if(i==1){
	  			if(key>50) i=key-50;
	  		}
	  		if(str[i]==key){
	  			judege=1;
	  			printf("%d\n",i);
	  			break;
	  		}
	  	}
	  	if(!judege) printf("0\n");
	  }
		return 0;
}
时间: 2024-12-17 10:05:43

UVa 1583打表的相关文章

UVa 1583 Digit Generator(数)

For a positive integer N , the digit-sum of N is defined as the sum of N itself and its digits. When M is the digitsum of N , we call N a generator of M . For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5). Therefore, 245 is a generator of 

uva 1583 B - Digit Generator (暴力)

B - Digit Generator Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description For a positive integer N<tex2html_verbatim_mark> , the digit-sum of N<tex2html_verbatim_mark> is defined as the sum of N&l

生成元(Digit Generator ,ACM/ICPC Seoul 2005 ,UVa 1583)

生成元:如果 x 加上 x 各个数字之和得到y,则说x是y的生成元. n(1<=n<=100000),求最小生成元,无解输出0. 例如:n=216 , 解是:198 198+1+9+8=216 解题思路:打表 循环将从1到10005(大点也可以)进行提前写好. 例如: 1  1+1=2,-->  arr[2]=1 13 13+1+3=17,-->arr[17]=13 34  34+3+4=41, -->arr[41]=34 打完表后,直接将给的数作为下标,输出即可. #inc

UVa 10820 (打表、欧拉函数) Send a Table

题意: 题目背景略去,将这道题很容易转化为,给出n求,n以内的有序数对(x, y)互素的对数. 分析: 问题还可以继续转化. 根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1). 设f(n)为 集合S{(x, y) | x<y且x.y互素} 的个数,则所求答案为2f(n)+1 f(n)表达式为: ,其中φ(n)为欧拉函数 这里有欧拉函数的一些介绍 1 #include <cstdio> 2 3 const int maxn = 50000; 4 5 int ph

UVa 1583 Digit Generator(数学)

 题意 如果a加上a所有数位上的数等于b时 a称为b的generator  求给定数的最小generator 给的数n是小于100,000的  考虑到所有数位和最大的数99,999的数位和也才45  因此我们只需要从n-45到n枚举就行了 #include<cstdio> #include<cstring> using namespace std; int t, n, a, b, ans, l; int main() { scanf ("%d", &

UVA 10820 交表

#include<iostream> #include<string> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<math.h> #include<vector> #include<stdlib.h> #define maxn 50000 #include<algorithm&g

生成元(Digit Generator,ACM/ICPC Seoul 2005,UVa 1583)

#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int t, n, a, b, ans, l;int main(){ scanf("%d", &t);//这句话是为了确定一个最大的范围,比如说10000 while (t--) { scanf("%d", &n); ans = 0; for (int i = n - 50;

UVa 1583 Digit Generator WA

#include<stdio.h> int main() { long int n,i,s=0; while(scanf("%d",&n)!=EOF) { int flag=0; for(i=n-46;i<=n;i++) { s=i%10+i/10%10+i/100%10+i/1000%10+i/10000%10; if(s+i==n) { flag=1; break; } } if(flag) printf("%ld\n",i); els

例题3-5 Digit Generator UVA - 1583

我还想把它当成一道数学题做,但是发现代码实现太繁琐.直接搜索肯定会超时的,所以我要确定遍历的区间.区间的上界我找到了,但是我无法准确的确定区间下界.所以我觉得这个方法不靠谱,就看了题解. 题解用的预处理,先把所有十万以内的正整数都遍历一遍,得到离i最近的以i为最小生成元的数t.以t为下标,将i赋值给ans[t],继续遍历.如果接下来存在另一个i,为t的生成元,并且比原先的ans[t]更小,就ans[t]=i,否则不处理.最后直接输入一个数,输出答案数组中这个数的值即可. #include <bi