zoukankan      html  css  js  c++  java
  • 水仙花数

    链接:https://ac.nowcoder.com/acm/contest/2763/D
    来源:牛客网

    题目描述

    说到水仙花数,那当然是道谭浩翔书里的经典水题啦~

    原题是这样的:水仙花数是指一个三位数,各位数字的立方和等于它本身。求所有的水仙花数。

    不过,作为ACM选拔赛,自然是不会出这种既原又水的题的。谭浩翔特意又为大家准备了X·水仙花数。一个n位正整数,只要它的各位数字的n次方和的X倍等于该数本身,它就是一个X·水仙花数~

    当然,谭浩翔还是很水的。他并不准备让你求所有的X·水仙花数。现在,他给了你一个范围[n,m],让你求n~m中所有的X·水仙花数。

    输入描述:

    有多组输入。

    每组输入两行。

    第一行输入一个正整数X(1≤X≤109)X(1le Xle 10^9)X(1X109)

    第二行输入两个整数n,m(1≤n≤m≤109)n,m(1le nle mle 10^9)n,m(1nm109),代表一个[n,m]的闭区间

    具体含义见题目描述

    输出描述:

    对于每组输入,从小到大输出[n,m]内所有的X·水仙花数,一行一个。数据保证至少有一个。每组输出后额外输出一个空行。
    示例1

    输入

    复制
    1
    100 999
    5
    1 100

    输出

    复制
    153
    370
    371
    407
    
    20



    题解:快速幂 + 优化计算的位数还是TLE

    #include <bits/stdc++.h>
    
    using namespace std;
    
    long long solve[9];
    
    long long quickpower(long long a,long long b)
    {
          long long s=1;
          while(b>0){
              if(b%2==1){
                  s=s*a;
            }
            a=a*a;
            b=b>>1;
        }
        return s;
    }
    
    long long get_len(int n){
        int count=0;
        while(n!=0){
            n/=10;
            count++;
        }
        return count;
    }
    
    int main(){
        long long x,n,m,c;
        while(scanf("%lld",&x)!=EOF){
            scanf("%lld %lld",&n,&m);
            long long len = get_len(n);
            if(len==1)    c=1;
            else c=pow(10,len-1);
            for(int i=0;i<10;i++)    
                solve[i]=quickpower(i,len);
            for(long long i=n;i<=m;i++){
                long long k=i;
                long long r=0;
                while(k!=0){
                    int d=k%10;
                    if(i/c>=10){
                        for(int j=0;j<10;j++)    
                            solve[j]=solve[j]*j;
                        c*=10;
                    }
                    long long t=solve[d];    
                    //long long t=quickpower(d,len);
                    r+=t;
                    k/=10;
                }
                if(i==r*x)    printf("%lld
    ",i);
            }
            printf("
    ");
        }
        return 0;
    }

    方法一:预算暴力打表

    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <set>
    #include <stack>
    #include <unordered_map>
    #include <vector>
    #define fir first
    #define se second
    #define ll long long
    #define pb push_back
    #define mp make_pair
    #define ull unsigned long long
    #define cl(a, b) memset(a, b, sizeof(a))
    #define quickio(a) ios::sync_with_stdio(a)
    #define datatest() freopen("data.in", "r", stdin)
    #define pii pair<int, int>
    #define pdd pair<double, double>
    #define makeans() freopen("data.out", "w", stdout)
    using namespace std;
    const int maxn = 1e7 + 10;
    const int maxm = 1e6 + 10;
    const int inf = 0x3f3f3f3f;
    const ll mod = 1e9 + 7;
    const int maxblock = sqrt(maxn) + 10;
    const double eps = 1e-7;
    const ll INF = 1e16;
    int res[455] = {
        0,         1,         2,         3,         4,         5,
        6,         7,         8,         9,         10,        20,
        50,        100,       110,       111,       153,       200,
        221,       370,       371,       407,       500,       702,
        1000,      1010,      1011,      1020,      1100,      1101,
        1110,      1121,      1122,      1634,      2000,      2322,
        4104,      5000,      8208,      9474,      10000,     10010,
        10011,     10100,     10101,     10110,     11000,     11001,
        11010,     11022,     11100,     11122,     11220,     12012,
        12110,     12210,     12320,     14550,     20000,     21120,
        21321,     22100,     22110,     36504,     41000,     41500,
        41510,     42240,     44364,     50000,     54748,     92727,
        93084,     100000,    100010,    100011,    100100,    100101,
        100110,    101000,    101001,    101010,    101100,    110000,
        110001,    110010,    110100,    111000,    111100,    111110,
        112401,    120120,    200000,    210210,    304101,    311100,
        322232,    500000,    548834,    647361,    650308,    1000000,
        1000010,   1000011,   1000100,   1000101,   1000110,   1001000,
        1001001,   1001010,   1001100,   1001102,   1010000,   1010001,
        1010010,   1010100,   1011000,   1011100,   1011110,   1011120,
        1012230,   1100000,   1100001,   1100010,   1100100,   1101000,
        1101012,   1101100,   1101110,   1110000,   1110100,   1110110,
        1110120,   1111000,   1111010,   1111100,   1111110,   1112100,
        1112121,   1113120,   1121120,   1210020,   1211100,   1212112,
        1220211,   1224210,   1300040,   1313100,   1330000,   1741725,
        2000000,   2001002,   2021220,   2100120,   2100222,   2132032,
        2431000,   3012100,   3104200,   3135000,   3305120,   3334320,
        4041042,   4041124,   4210818,   4264064,   5000000,   5242320,
        5560625,   6736436,   9800817,   9926315,   10000000,  10000010,
        10000011,  10000100,  10000101,  10000110,  10001000,  10001001,
        10001010,  10001100,  10010000,  10010001,  10010010,  10010100,
        10011000,  10011100,  10011110,  10100000,  10100001,  10100010,
        10100100,  10101000,  10101100,  10101110,  10110000,  10110100,
        10110110,  10111000,  10111010,  10111100,  10111110,  10201120,
        10220210,  11000000,  11000001,  11000010,  11000100,  11001000,
        11001100,  11001110,  11001120,  11010000,  11010100,  11010110,
        11011000,  11011010,  11011100,  11011110,  11100000,  11100100,
        11100110,  11101000,  11101010,  11101100,  11101110,  11101111,
        11103400,  11110000,  11110010,  11110100,  11110110,  11111000,
        11111010,  11111100,  11210212,  12001220,  12022010,  12120010,
        12120120,  12221461,  12310100,  20000000,  20121300,  20221200,
        21010220,  21210210,  22001210,  22011100,  22111222,  22144320,
        23113020,  24678050,  24678051,  30231012,  32113230,  32321341,
        35461510,  41040340,  41223132,  43614000,  44043300,  50000000,
        88593477,  88716166,  100000000, 100000010, 100000011, 100000100,
        100000101, 100000110, 100001000, 100001001, 100001010, 100001100,
        100004220, 100010000, 100010001, 100010010, 100010100, 100011000,
        100011100, 100011110, 100011120, 100100000, 100100001, 100100010,
        100100100, 100101000, 100101100, 100101110, 100110000, 100110100,
        100110110, 100111000, 100111010, 100111100, 100111110, 100201212,
        100231410, 101000000, 101000001, 101000010, 101000100, 101001000,
        101001100, 101001110, 101010000, 101010100, 101010110, 101011000,
        101011010, 101011100, 101011110, 101022222, 101100000, 101100100,
        101100110, 101101000, 101101010, 101101100, 101101110, 101110000,
        101110010, 101110100, 101110110, 101110200, 101111000, 101111010,
        101111100, 101111101, 101124100, 101201121, 101221120, 102111124,
        102200022, 102221200, 110000000, 110000001, 110000010, 110000100,
        110001000, 110001100, 110001110, 110010000, 110010100, 110010110,
        110011000, 110011010, 110011100, 110011110, 110011111, 110011200,
        110100000, 110100100, 110100110, 110101000, 110101010, 110101100,
        110101110, 110110000, 110110010, 110110100, 110110110, 110111000,
        110111010, 110111100, 110210000, 110220102, 110312112, 111000000,
        111000100, 111000110, 111001000, 111001010, 111001100, 111001110,
        111010000, 111010010, 111010100, 111010110, 111011000, 111011010,
        111011100, 111011110, 111100000, 111100010, 111100100, 111100110,
        111101000, 111101010, 111101011, 111101100, 111110000, 111110010,
        111110100, 111111000, 111111111, 112101000, 112101220, 112212100,
        120011220, 120020320, 120102021, 121011020, 121110220, 121221100,
        122011120, 122100111, 122220210, 122221000, 131220032, 143336116,
        146511208, 172453440, 200000000, 200002100, 201001220, 201021102,
        201111000, 210002000, 210033200, 210101202, 210212010, 211013032,
        211020552, 211120020, 212101120, 212200212, 212211110, 212220100,
        221110120, 232134002, 262302612, 302322200, 320221020, 331110110,
        332312022, 340440132, 374816544, 413003304, 420043544, 424202240,
        472335975, 500000000, 534494836, 586204332, 634325568, 641102010,
        706176030, 733657561, 780036264, 912985153, 1000000000};
    ll num[455] = {
        1,         1,        1,        1,        1,        1,        1,
        1,         1,        1,        10,       5,        2,        100,
        55,        37,       1,        25,       13,       1,        1,
        1,         4,        2,        1000,     505,      337,      60,
        550,       367,      370,      59,       33,       1,        125,
        18,        8,        8,        1,        1,        10000,    5005,
        3337,      5050,     3367,     3370,     5500,     3667,     3670,
        167,       3700,     166,      170,      182,      346,      185,
        40,        2,        625,      320,      69,       340,      335,
        3,         40,       10,       10,       20,       4,        16,
        1,         1,        1,        100000,   50005,    33337,    50050,
        33367,     33370,    50500,    33667,    33670,    33700,    55000,
        36667,     36670,    36700,    37000,    27775,    22222,    27,
        924,       3125,     1617,     63,       425,      188,      32,
        1,         3,        2,        1000000,  500005,   333337,   500050,
        333367,    333370,   500500,   333667,   333670,   333700,   7642,
        505000,    336667,   336670,   336700,   337000,   252775,   202222,
        7660,      414,      550000,   366667,   366670,   366700,   367000,
        8341,      275275,   220222,   370000,   277525,   222022,   8410,
        277750,    222202,   222220,   185185,   8425,     4261,     480,
        4312,      4690,     9175,     3124,     3153,     73,       70,
        300,       304,      1,        15625,    7786,     3940,     8140,
        4094,      448,      130,      1300,     166,      38,       40,
        132,       82,       82,       1,        7,        64,       54,
        7,         4,        1,        1,        10000000, 5000005,  3333337,
        5000050,   3333367,  3333370,  5000500,  3333667,  3333670,  3333700,
        5005000,   3336667,  3336670,  3336700,  3337000,  2502775,  2002222,
        5050000,   3366667,  3366670,  3366700,  3367000,  2525275,  2020222,
        3370000,   2527525,  2022022,  2527750,  2022202,  2022220,  1685185,
        19808,     13273,    5500000,  3666667,  3666670,  3666700,  3667000,
        2750275,   2200222,  42312,    3670000,  2752525,  2202022,  2752750,
        2202202,   2202220,  1835185,  3700000,  2775025,  2220022,  2775250,
        2220202,   2220220,  1850185,  1585873,  154,      2777500,  2222002,
        2222020,   1851685,  2222200,  1851835,  1851850,  14521,    15586,
        15613,     23534,    15720,    7,        1805,     78125,    2844,
        19728,     27286,    27510,    28573,    42740,    17234,    160,
        1695,      1,        1,        2217,     1590,     377,      14,
        202,       519,      24,       210,      128,      1,        2,
        100000000, 50000005, 33333337, 50000050, 33333367, 33333370, 50000500,
        33333667,  33333670, 33333700, 380,      50005000, 33336667, 33336670,
        33336700,  33337000, 25002775, 20002222, 193820,   50050000, 33366667,
        33366670,  33366700, 33367000, 25025275, 20020222, 33370000, 25027525,
        20022022,  25027750, 20022202, 20022220, 16685185, 65108,    355,
        50500000,  33666667, 33666670, 33666700, 33667000, 25250275, 20200222,
        33670000,  25252525, 20202022, 25252750, 20202202, 20202220, 16835185,
        39431,     33700000, 25275025, 20220022, 25275250, 20220202, 20220220,
        16850185,  25277500, 20222002, 20222020, 16851685, 195950,   20222200,
        16851835,  16851850, 14444443, 385,      98349,    65728,    388,
        49878,     49864,    55000000, 36666667, 36666670, 36666700, 36667000,
        27500275,  22000222, 36670000, 27502525, 22002022, 27502750, 22002202,
        22002220,  18335185, 15715873, 213200,   36700000, 27525025, 22020022,
        27525250,  22020202, 22020220, 18350185, 27527500, 22022002, 22022020,
        18351685,  22022200, 18351835, 18351850, 214000,   71618,    5326,
        37000000,  27750025, 22200022, 27750250, 22200202, 22200220, 18500185,
        27752500,  22202002, 22202020, 18501685, 22202200, 18501835, 18501850,
        15858730,  27775000, 22220002, 22220020, 18516685, 22220200, 18516835,
        15871573,  18516850, 22222000, 18518335, 18518350, 18518500, 12345679,
        217250,    72793,    72865,    77980,    5656,     78039,    117715,
        78643,     78715,    79228,    118659,   47705,    59620,    3208,
        7,         1,        4,        390625,   195124,   130690,   130618,
        389750,    204880,   5200,     136518,   136590,   5224,     54,
        137180,    137728,   82826,    137710,   103522,   143578,   766,
        13,        7300,     14735,    8410,     5439,     412,      2,
        708,       139,      538,      1,        256,      1,        4,
        4,         62,       7,        7,        4,        1,        1000000000};
     
    int main() {
      int x, n, m;
      while (~scanf("%d %d %d", &x, &n, &m)) {
        int cnt = 0;
        for (int i = 0; i < 455; i++) {
          if (num[i] == x && res[i] >= n && res[i] <= m) {
            printf("%d
    ", res[i]);
          }
        }
        printf("
    ");
      }
      return 0;
    }

    方法二:看不懂

    #include<bits/stdc++.h>
    using namespace std;
      
    #define LL long long
      
    LL Pow[11][11];
    int a[10000][31];
    int x,l,r;
    bool check(int num)
    {
        int dig=0,sc=num;
        do{
            dig++;
            sc/=10;
        }while(sc);
        sc=num;
        LL DigistSum=0;
        do{
            DigistSum+=Pow[sc%10][dig];
            if(DigistSum*x>num)return false;
            sc/=10;
        }while(sc);
        if(DigistSum*x==num)return true;
        else return false;
    }
    void init()
    {
        for(int i=1;i<=9;i++)
        {
            Pow[i][0]=1;
            for(int j=1;j<=10;j++)
                Pow[i][j]=Pow[i][j-1]*i;
        }
    a[1][0]=1;a[1][1]=2;a[1][2]=3;a[1][3]=4;a[1][4]=5;a[1][5]=6;a[1][6]=7;a[1][7]=8;a[1][8]=9;a[1][9]=153;a[1][10]=370;a[1][11]=371;a[1][12]=407;a[1][13]=1634;a[1][14]=8208;a[1][15]=9474;a[1][16]=54748;a[1][17]=92727;a[1][18]=93084;a[1][19]=548834;a[1][20]=1741725;a[1][21]=4210818;a[1][22]=9800817;a[1][23]=9926315;a[1][24]=24678050;a[1][25]=24678051;a[1][26]=88593477;a[1][27]=146511208;a[1][28]=472335975;a[1][29]=534494836;a[1][30]=912985153;a[2][0]=50;a[2][1]=702;a[2][2]=14550;a[2][3]=650308;a[2][4]=88716166;a[2][5]=374816544;a[3][0]=36504;a[3][1]=647361;a[4][0]=500;a[4][1]=44364;a[4][2]=6736436;a[4][3]=172453440;a[4][4]=586204332;a[4][5]=634325568;a[4][6]=780036264;a[5][0]=20;a[7][0]=4264064;a[7][1]=5560625;a[7][2]=12221461;a[7][3]=143336116;a[7][4]=706176030;a[7][5]=733657561;a[8][0]=4104;a[8][1]=5000;a[10][0]=10;a[10][1]=41500;a[10][2]=41510;a[13][0]=221;a[13][1]=262302612;a[14][0]=35461510;a[16][0]=50000;a[18][0]=2322;a[20][0]=42240;a[24][0]=43614000;a[25][0]=200;a[27][0]=112401;a[32][0]=500000;a[33][0]=1122;a[37][0]=111;a[38][0]=3135000;a[40][0]=12320;a[40][1]=41000;a[40][2]=3305120;a[54][0]=5242320;a[54][1]=211020552;a[55][0]=110;a[59][0]=1121;a[60][0]=1020;a[62][0]=641102010;a[63][0]=304101;a[64][0]=5000000;a[69][0]=21321;a[70][0]=1300040;a[73][0]=1224210;a[82][0]=4041042;a[82][1]=4041124;a[100][0]=100;a[125][0]=2000;a[128][0]=50000000;a[130][0]=2431000;a[132][0]=3334320;a[139][0]=420043544;a[154][0]=11103400;a[160][0]=22144320;a[166][0]=11122;a[166][1]=3104200;a[167][0]=11022;a[170][0]=11220;a[182][0]=12012;a[185][0]=12210;a[188][0]=322232;a[202][0]=41040340;a[210][0]=44043300;a[256][0]=500000000;a[300][0]=1313100;a[304][0]=1330000;a[320][0]=21120;a[335][0]=22110;a[337][0]=1011;a[340][0]=22100;a[346][0]=12110;a[355][0]=100231410;a[367][0]=1101;a[370][0]=1110;a[377][0]=32321341;a[380][0]=100004220;a[385][0]=101124100;a[388][0]=102111124;a[412][0]=340440132;a[414][0]=1012230;a[425][0]=311100;a[448][0]=2132032;a[480][0]=1113120;a[505][0]=1010;a[519][0]=41223132;a[538][0]=424202240;a[550][0]=1100;a[625][0]=20000;a[708][0]=413003304;a[766][0]=232134002;a[924][0]=120120;
    a[1000][0]=1000;a[1300][0]=3012100;a[1590][0]=32113230;a[1617][0]=210210;a[1695][0]=23113020;a[1805][0]=12310100;a[2217][0]=30231012;a[2844][0]=20121300;a[3124][0]=1212112;a[3125][0]=200000;a[3153][0]=1220211;a[3208][0]=131220032;a[3337][0]=10011;a[3367][0]=10101;a[3370][0]=10110;a[3667][0]=11001;a[3670][0]=11010;a[3700][0]=11100;a[3940][0]=2021220;a[4094][0]=2100222;a[4261][0]=1112121;a[4312][0]=1121120;a[4690][0]=1210020;a[5005][0]=10010;a[5050][0]=10100;a[5200][0]=210033200;a[5224][0]=211013032;a[5326][0]=110312112;a[5439][0]=332312022;a[5500][0]=11000;a[5656][0]=120020320;a[7300][0]=302322200;a[7642][0]=1001102;a[7660][0]=1011120;a[7786][0]=2001002;a[8140][0]=2100120;a[8341][0]=1101012;a[8410][0]=1110120;a[8410][1]=331110110;a[8425][0]=1112100;a[9175][0]=1211100;
    }
    int main()
    {
        init();
        while(scanf("%d",&x)!=EOF)
        {
            scanf("%d%d",&l,&r);
            if(x>=10000)
            {
                if(l%x==0);
                else l=l+x-l%x;
                for(int i=l;i<=r;i+=x)
                {
                    if(check(i))printf("%d
    ",i);
                }
            }
            else
            {
                for(int i=0;i<=30;i++)
                    if(a[x][i]>=l&&a[x][i]<=r)
                        printf("%d
    ",a[x][i]);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    matlab2016b
    【ccf- csp201509-4】高速公路
    【ccf- csp201412-2】z字形扫描
    【ccf-csp201512-5】矩阵
    【动态规划】矩阵连乘分析
    JAVA环境搭建
    【离散数学2】代数系统趣题
    给文本编辑框绑定变量
    清空文本框SetDlgItemText(IDC_TXTXT,NULL);
    有关SetTimer函数的用法
  • 原文地址:https://www.cnblogs.com/shiliuxinya/p/12171216.html
Copyright © 2011-2022 走看看