某考试 T1 至危警告

题目大意就是:

    设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\n",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;
}

  

posted @ 2018-03-26 20:29  蒟蒻JHY  阅读(248)  评论(0编辑  收藏  举报