生成元 例题3-5

例题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。

分析

本题看起来是个数学题, 实则不然。 假设所求生成元为m。 不难发现m < n。 换句话说,
只需枚举所有的m < n, 看看有没有哪个数是n的生成元。
可惜这样做的效率并不高, 因为每次计算一个n的生成元都需要枚举n-1个数。 有没有更
快的方法? 聪明的读者也许已经想到了: 只需一次性枚举100000内的所有正整数m, 标
记“m加上m的各个数字之和得到的数有一个生成元是m”, 最后查表即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
int ans[maxn];


int main()
{
    int T, n;
    memset(ans, 0, sizeof(ans));
    for(int m = 1; m < maxn; m++) {
        int x = m, y = m;
        while(x) { y += x % 10; x /= 10;}
        if(ans[y] == 0 || m < ans[y])  ans[y] = m;//打表
    }
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        printf("%d\n", ans[n]);
    }

}

posted @   bakul  阅读(0)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示