• 某考试 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
    ",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;
    }
    

      

  • 相关阅读:
    uva 532 Dungeon Master
    hrbeu 哈工程 Tunnels
    poj 1088 滑雪
    hrbeu 哈工程 Eular Graph
    uva 567 Risk
    hrbeu 哈工程 Minimum time
    产品要不要做先回答的10个问题
    用icacls命令行给目录赋权
    SQL Server的FileStream和FileTable
    cygwin 离线安装包(包括vim,ssh,scp)
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8653524.html
Copyright © 2020-2023  润新知