codevs月赛第一场(3943)数学奇才琪露诺

           题目描述                    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≤109。

l,r 范围可知,数最多只有 9 位,即数位之和 s 最大为 81 ,而经过分析可以得出,每一个 s 经过那么一系列计算后只会对应一个 x ,所以可枚举 s ,通过题目要求判断是否合法得到解, O(1) 解决。

#include
#include
using namespace std;
int k,p,q,l,r,n=0;
int ans[110000];
int shuwei(int x)
{
   int sum=0;
   while (x>0)
   {
       sum+=x%10;
       x/=10;
   }
   return sum;
}
int main()
{
   scanf("%d%d%d%d%d",&k,&p,&q,&l,&r);
   for (int s=1;s<=81;++s)
   {
       long long x=p;
       for (int i=1;i<=k;++i)
           x*=s;
       x+=q;
       if ((x>=l)and(x<=r)and(shuwei((int)x)==s))
           ans[++n]=x;
   }
   sort(ans+1,ans+n+1);
   printf("%d\n",n);
   for (int i=1;i<=n;++i)
       printf("%d ",ans[i]);
   return 0;
}

你可能感兴趣的:(刷题)