zoukankan      html  css  js  c++  java
  • 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

      如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小 生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。

    【分析】

      本题看起来是个数学题,实则不然。假设所求生成元为m。不难发现m<n。换句话说,只需枚举所有的m<nn,看看有没有哪个数是n的生成元。

      可惜这样做的效率并不高,因为每次计算一个n的生成元都需要枚举n-1个数。有没有更快的方法?聪明的读者也许已经想到了:只需一次性枚举100000内的所有正整数m,标记“m加上m的各个数字之和得到的数有一个生成元是m”,最后查表即可。

    #include<cstdio>
    #define maxn 100020
    using namespace std;
    int ans[maxn];//ans数组含义:在y处存了y的最小生成元 
    void pre(){
        for(int m=1;m<=100000;m++){
            int x=m,y=m;
            while(x>0){
                y+=x%10;x/=10;
            }//y此时存放了生成元+各位数 的值 
            if(ans[y]==0||m<ans[y]){
                ans[y]=m;
            }
        }
    } 
    int main(){
        pre();
        int n,T;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            printf("%d
    ",ans[n]);
        }
    return 0;
    }

    注意:

    函数pre()即预处理,处理的ans数组。

    ans数组的含义

  • 相关阅读:
    java枚举enum
    冒泡排序、选择排序、插入排序、二分法排序、快速排序、二叉树排序、堆排序总结
    Django-tinymce富文本的使用
    Redis-基本操作总结
    git-总结大全
    css-总结
    html-table布局
    html表单示例
    html总结
    python-浅拷贝、深拷贝实例以及讲解
  • 原文地址:https://www.cnblogs.com/LOW-ctfer/p/10366877.html
Copyright © 2011-2022 走看看