题目描述 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每个数都判断一下的话是不可行的,所以我们可以逆向思维一下,最大有可能的数为999999999,位数之和为81,所以我们可以枚举1~81,判断是否符合条件,这样效率就大大提高了。
题解:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long a[100000];
long long ksm(long long x,long long y)
{
if(y==0)
{
return 1;
}
long long ans=ksm(x,y/2);
ans*=ans;
if(y%2==1)
{
ans*=x;
}
return ans;
}
int main()
{
long long k,p,q;
scanf("%lld%lld%lld",&k,&p,&q);
long long l,r;
scanf("%lld%lld",&l,&r);
long long tot=0;
for(long long i=1;i<=81;i++)
{
long long now=ksm(i,k);
now*=p;
now+=q;
if(now>=l&&now<=r)
{
long long sum=0;
long long x=now;
while(x)
{
sum+=x%10;
x/=10;
}
if(sum==i)
{
a[++tot]=now;
}
}
}
printf("%d\n",tot);
for(int i=1;i<=tot;i++)
{
printf("%d ",a[i]);
}
return 0;
}