• 区间存在幂个数


    题面

    “给出 l, r, k,请从小到大输出所有在 [l, r] 范围内,能表示为 k 的非负整数次方的所有数。”
    “多组数据。

    ,XXX 补充说,
    “注意所有数的 0 次方都为 1,因此 1 也得算进去哦。”

    输入

    第一行一个数 T,表示数据组数。
    接下来 T 行,每行 3 个数 l,r,k,表示一组数据。

    输出

    对于每一组数据输出一行(总共输出 T 行)。
    如果存在符合要求的数,则在一行内从小到大输出这些数;否则输出一个字符串
    "None."(包括句点,不包括引号)

    样例

    输入样例 1
    4
    1 10 2
    2 4 5
    19562 31702689720 17701
    3680 37745933600 10
    输出样例 1
    1 2 4 8
    None.
    313325401
    10000 100000 1000000 10000000 100000000 1000000000 10000000000

    数据说明

    对于所有数据,T ≤ 10000,l ≤ r,0≤ l,r,k < 2 63 。
    子任务 1(20 分)
    :r - l ≤ 1000。
    子任务 2(30 分)
    :l, r, k < 2 31 。
    子任务 3(50 分)
    :l, r, k < 2 63 。
    这里的子任务表示的是数据类型,并不捆绑测试。
    三个子任务中,各有 10 分的数据,满足 T = 10 且数据是随机的。
    特别注意:本题中 0 的 0 次方也看做 1。

    题解放代码里好叭。

    代码

    #include <cstdio>
    #include <vector>
    #define ll long long
    #define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
    using namespace std;
    inline ll read(){
    	ll x=0,f=1;char c=getchar();
    	while (c>'9'||c<'0') {if (c=='-') f=-1;c=getchar();}
    	while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    	return x*f;
    }
    ll l,r,k;
    void work(){
    	l=read(),r=read(),k=read();
    	vector <ll> v(0);//初始化
    	if (k==0){//特判0 1的情况
    		if (l<=0&&0<=r) v.push_back(0);
    		if (l<=1&&1<=r) v.push_back(1);
    	}
    	else if (k==1){
    		if (l<=1&&1<=r) v.push_back(1);
    	}
    	else{
    		for (ll i(1);;i*=k){
    			if (l<=i&&i<=r) v.push_back(i);
    			if (r/i<k) break;//i*k可能longlong溢出 所以加个特判
    		}
    	}
    	if (v.empty()) puts("None.");
    	else{
    		for (int i(0);i<v.size();++i) printf("%lld ",v[i]);
    		puts("");
    	}
    }
    
    int main(){
    //	file("dynamic");
    	ll t=read();
    	while (t--) work();
    	return 0;
    }
    //下文忽视
    /*ll l,r,k,flag;
    void init(){
    	l=read(),r=read(),k=read();
    }
    
    void doit(){
    	int flag=0;
    	for (ll i(1);;i*=k){
    		if (l<=i&&i<=r) flag=1,printf("%lld ",i);
    		if (r/i<k) break;
    	}
    	if (flag==0) printf("None.");
    	puts("");
    }
    
    int main(){
    //	file("dynamic");
    	ll t=read();
    	while (t--){
    		init();
    		flag=0;
    		if (k==0){
    			if (l<=0&&0<=r)	flag=1,printf("0 ");
    			if (l<=1&&1<=r) flag=1,printf("1");
    			if (!flag) printf("None.");
    			puts("");
    		}
    		else if (k==1){
    			if (l<=1&&1<=r) flag=1,puts("1");
    			if (!flag) printf("None.");
    			puts("");
    		}
    		else doit();
    	}
    	return 0;
    }
    */这是水逼做法,无优化无动脑细节
    
    
  • 相关阅读:
    LightOJ1031 Easy Game(区间DP)
    POJ1325 Machine Schedule(二分图最小点覆盖集)
    ZOJ1654 Place the Robots(二分图最大匹配)
    LightOJ1025 The Specials Menu(区间DP)
    POJ2288 Islands and Bridges(TSP:状压DP)
    LightOJ1021 Painful Bases(状压DP)
    LightOJ1013 Love Calculator(DP)
    POJ1780 Code(欧拉路径)
    POJ1201 Intervals(差分约束系统)
    ZOJ2770 Burn the Linked Camp(差分约束系统)
  • 原文地址:https://www.cnblogs.com/cancers/p/11565103.html
Copyright © 2020-2023  润新知