• 简单搜索(多位自幂数)+数列网站


    题目:
    我们定义n位自幂数为:
    如果x是n位数,x的各位的n次方的也为x,那么x为n位自幂数
    求n位自幂数有哪些,0< n <=19,x > 0,排序后输出
    时限3000ms。

    解法1:打表
    首先,如果拿到一个数列,可以先试试这个网站:OEIS,输入数列串,就会返回通项公式同时给出表,可以以后直接打表用。

    解法2:搜索
    怎么搜索??
    暴力枚举n位?最差情况9^19种情况,会炸。时间复杂度链接
    其实我们观察,174和741,其实是一种东西,所以求解自幂数的关键是求一个数x中它每一位数字重复出现的个数,至于这些数字怎么排列其实没关系,我们要做的就是枚举各个数字重复出现的个数即可。

    代码如下:

    #include<cstdio>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int n, a[20], f[20], cnt;
    ll ans[20];
    
    //快速幂
    ll poww(int a, int b) {
        ll ans = 1, base = a;
        while (b != 0) {
            if (b & 1 != 0)
                ans *= base;
            base *= base;
            b >>= 1;
        }
        return ans;
    }
    
    int calc(ll sum) {
        ll t = sum;
        int num = 0;
        memset(f, 0, sizeof(f));
        while (t) {
            ll tmp = t % 10;
            t /= 10;
            f[tmp] ++;
            num++;
        }
        return num;
    }
    
    //数字比较大,在爆ll的边缘试探,所以这里拿double检测一下
    //ps是填充到哪个数字了,hs是还能填充几个数字
    void dfs(int ps, int hs, ll sum, double dbsum) {
        if (ps == 9) {
            a[ps] = hs;
            sum += (ll)hs*poww(9, n);
            dbsum += (double)hs*poww(9, n);
            if (dbsum <= 1e19&&sum > 0) {
                if (calc(sum) == n) {
                    bool flag = 1;
                    for (int i = 0; i <= 9; i++) {
                        if (f[i] != a[i])flag = 0;
                    }
                    if (flag)ans[cnt++] = sum;
                }
            }
            return;
        }
        for (int i = 0; i <= hs; i++) {
            a[ps] = i;
            dfs(ps + 1, hs - i, sum + (ll)i*poww(ps, n), dbsum + (double)i*poww(ps, n));
        }
    }
    
    int main() {
        scanf("%d", &n);
        memset(ans, 0, sizeof(ans)); cnt = 0;
        dfs(0, n, 0, 0);
        if (!cnt) { printf("-1
    "); }
        else {
            sort(ans, ans + cnt);
            for (int i = 0; i < cnt; i++) {
                printf("%lld ", ans[i]);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    JS生成Guid
    MVC——分页
    MVC入门——删除页
    MVC入门——编辑页
    MVC入门——详细页
    MVC入门——列表页
    MVC入门——增
    pandas使用
    简单线性回归预测实现
    flask 自定义url转换器
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9489819.html
Copyright © 2020-2023  润新知