3943 数学奇才琪露诺 codevs月赛 第一场
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
作为上白泽慧音老师的出色弟子,数学奇才琪露诺在算术方面有很深的造诣。今天,codevs有幸请到了这位数学界的奇葩作为本场考试的第一题主考官。
琪露诺喜欢0-9之间的数字,她喜欢将十进制非负数字的每一位一一识别出来,再将它们用计算器加起来,也即数字的数位之和,例如,对于1234,琪露诺会用计算器算出1+2+3+4=10。
琪露诺不仅会使用计算器的加法,还会使用计算器的减法、乘法和求幂操作,她觉得一个数x对她来说是有趣的,当且仅当她将x的数位之和算出来后,进行求k次幂的操作,再乘p,再加上或减去|q|,得到的数恰好还是x。
琪露诺是非常好奇,在一段区间[l,r]以内的所有整数x里,有多少个x对她来说是有趣的,她希望你能帮她解决这个问题。
输入描述 Input Description
第一行三个整数k,p和q,表示求k次幂,乘以p,如果q为正则加上|q|,如果非正则减去|q|。
第二行两个非负整数l和r,表示所求的区间,保证l≤r。
输出描述 Output Description
第一行一个非负整数n,表示有多少个有趣的x。
如果为n正,则第二行升序输出n个非负整数,表示这n个有趣的数字,数字之间用一个空格隔开,行末可以有多余空格。
样例输入 Sample Input
2 2 -1
1 999
样例输出 Sample Output
4
1 31 337 967
数据范围及提示 Data Size & Hint
对于100%的数据,有1≤k≤5,0≤p,|q|≤10000,0≤l≤r≤10^9。
数据范围这么大显然不是暴力可以做的,那么我们换一个思路,从1 到10^9范围内,各个数位上的数字相加之和的最大值是81(999999999),那么只需要枚举0到81,进行运算,判断得出来的数字x的各个数位和是不是与之前的相等,如果相等,加入数组。
把0到81 都枚举完之后,把数组中的数进行从小到大排序,然后判断每一个数是否在[l,r]范围之内,记录,输出即可
program mys;
var d,p,q,i,j,k,m,n,t,l,r:longint;
a,ans,c:array[0..1000]of int64;
x,y:int64;
begin
readln(k,p,q);
readln(l,r);
t:=0;
for i:=0 to 81 do
begin
x:=1;
for j:=1 to k do
x:=x*i;
x:=x*p;
x:=x+q;
y:=x;
d:=0;
while y<>0 do
begin
d:=d+y mod 10;
y:=y div 10;
end;
if d=i then
begin
inc(t);
ans[t]:=x;
end;
end;
for i:=1 to 81 do
for j:=i+1 to 81 do
if ans[i]>ans[j] then
begin
x:=ans[i]; ans[i]:=ans[j]; ans[j]:=x;
end;
n:=0;
for i:=1 to 81 do
if (ans[i]>=l)and(r>=ans[i]) then
begin
inc(n);
c[n]:=ans[i];
end;
writeln(n);
for i:=1 to n do
write(c[i],' ');
end.