题目大意就是:
设f(x)为x各个位数字之和,求x属于[0,k]且b * f(x)^a + c = x的x个数并升序输出。
(a<=5 . b,c,<=10^4 . k<=10^9)
可以发现f(x)的可能取值(在本题)最多只有81种,并且f(x)确定了之后等号左边就确定了。于是我们可以大力枚举f(x)是多少,解出x之后再看看f(x)是不是等于枚举的值。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<vector>
#define ll long long
using namespace std;
const int maxn=233333;
ll T,a,b,c,k,ans,sol[maxn];
inline ll get(ll x){
if(x<0) return -19260817;
ll an=0;
for(;x;an+=x%10,x/=10);
return an;
}
inline ll ksm(ll x,ll y){
ll an=1;
for(;y;y>>=1,x=x*x) if(y&1) an=an*x;
return an;
}
inline void solve(){
ans=0,scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
for(int i=0;i<=81;i++){
ll now=ksm(i,a)*b+c;
if(get(now)==i&&now<=k) sol[++ans]=now;
}
if(!ans){
puts("0");
puts("-1");
return;
}
printf("%lld
",ans);
sort(sol+1,sol+ans+1);
for(int i=1;i<=ans;i++) printf("%lld ",sol[i]);
puts("");
}
int main(){
freopen("safe.in","r",stdin);
freopen("safe.out","w",stdout);
scanf("%lld",&T);
while(T--) solve();
return 0;
}