UVA1583(最小生成元)

对于这种需要一遍遍枚举求解的,打表可以提高很多效率

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

int ans[100010];

int main()
{
     int i;
     mem(ans,0);
     for(i=1;i<100000;i++)
     {
          int m = i,n=i;
          while(n)
          {
               m+=n%10;
               n/=10;
          }
          if(ans[m]==0 || i<ans[m])
               ans[m] = i;
     }
     int t;
     sf("%d",&t);
     pf("%d\n",ans[t]);
}
时间: 2024-10-17 00:16:34

UVA1583(最小生成元)的相关文章

UVA1583 最小生成元

题很简单,主要是懂题意. 思想是枚举. 1 #include<cstdio> 2 #include<cstring> 3 4 #define Max 100001 5 6 int ans[Max]; 7 8 int main() 9 { 10 // freopen("in.txt","r",stdin); 11 memset(ans,0,sizeof(ans)); 12 for(int i = 1;i < 100001; i++){ 1

最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

Question 例题3-5 最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583) 如果x+x的各个数字之和得到y,就是说x是y的生成元.给出n(1<=n<=100000), 求最小生成元.无解输出0.例如,n=216,121,2005时的解分别是198,0,1979. Think 方法一:假设所求生成元记为m,不难发现m<n.换句话说,只需枚举所有的m<n,看看有木有哪个数是n的生成元.此举效率不高,因为每次计算一个n的生成元

【紫书】例题3-5 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

[题目描述] 如果x加上x的各个数字之和得到y,就说x是y的生成元.给出n(1≤n≤100000),求最小生成元.无解输出0.例如,n=216,121,2005时的解分别为198,0,1979. [代码实现] 方法1 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n = 0; 9 while ( scanf ("%d", &a

UVA1583 UVALive3355 Digit Generator

Regionals 2005 >> Asia - Seoul 问题链接:UVA1583 UVALive3355 Digit Generator.基础训练级的题,用C语言编写. 看题意,请点击上述链接. 查表法最为合理,即使试探法可能性太多,而且求最小的生成元比较困难. 不打表估计时间上也会超时. 程序中,打表功能封装到函数maketable(),使得主函数变得简洁.另外,打表时需要注意数组下标溢出问题.还需要注意,求的是最小生成元. AC通过的C语言程序如下: /* UVA1583 UVALi

生成元(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

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 256

Digit Generator, ACM/ICPC Seoul 2005, UVa1583

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 256

BZOJ 2277 Poi2011 Strongbox 数论

题目大意:给定n和k个整数,求mod n加法下的群G的一个子群G',满足a[1]~a[k-1]都不在群中而a[k]在群中 首先易证G'一定是一个循环群 证明:显然若a在群中则a的逆元在群中 那么我们就有了减法运算 由群的封闭性可得若a和b都在群中则gcd(a,b)一定在群中 不妨设g为G'中所有元素的gcd 那么群G''={0,g,2g,...}一定是G'的一个子群 由于G'-G''中的所有元素均不是g的倍数,故G'∩(G'-G'')为空 G'=G'' 由此可得G'是以g为最小生成元的一个循环子

例题3-5 Digit Generator UVA - 1583

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