某考试 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; }
我爱学习,学习使我快乐