链接: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(1\le X\le 10^9)X(1≤X≤109)
第二行输入两个整数n,m(1≤n≤m≤109)n,m(1\le n\le m\le 10^9)n,m(1≤n≤m≤109),代表一个[n,m]的闭区间
具体含义见题目描述
输出描述:
对于每组输入,从小到大输出[n,m]内所有的X·水仙花数,一行一个。数据保证至少有一个。每组输出后额外输出一个空行。
示例1
输入
复制1 100 999 5 1 100
输出
复制153 370 371 407 20
题解:快速幂 + 优化计算的位数还是TLE
#includeusing 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\n",i); } printf("\n"); } return 0; }
方法一:预算暴力打表
#include#include #include #include #include #include #include #include
方法二:看不懂
#includeusing 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\n",i); } } else { for(int i=0;i<=30;i++) if(a[x][i]>=l&&a[x][i]<=r) printf("%d\n",a[x][i]); } printf("\n"); } return 0; }