随笔 - 34,  文章 - 63,  评论 - 0,  阅读 - 4070
输出练习
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述 

为了练习输出,你需要从小到大输出 [l,r][l,r] 范围内能表示为 kk 的非负整数次方的所有数。

一共有 TT 次练习。注意所有数的 00 次方都是 11,特别地,本题中认为 0^0=100=1。

输入描述:

第一行一个整数 TT。

接下来 TT 行,每行三个整数 l,r,kl,r,k 表示一次练习的参数。

1\leq T\leq 10^41T104,l\leq rlr,0\leq l,r,k<2^{63}0l,r,k<263。

输出描述:

TT 行,每行从小到大输出符合要求的数,若不存在,输出一行 None.(包括句点)。
示例1

输入

复制
4
1 10 2
2 4 5
19562 31702689720 17701
3680 37745933600 10

输出

复制
1 2 4 8 
None.
313325401 
10000 100000 1000000 10000000 100000000 1000000000 10000000000
复制代码
#include <bits/stdc++.h>
#define fi first
#define se second 
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
#define data(x) tree[x].data

using namespace std;
const int N=2e5+20;
typedef long long  LL;

int t;
LL l,r,k;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&l,&r,&k);
        if(k==0)
        {
            if(l==0&&r>=1)
               puts("0 1");
               else if(l==0&&r==0)
               puts("0");
            else if(l==1&&r>=1)
            puts("1");
            else puts("None.");
        }
        else if(k==1)
        {//会有一部分的超时
            if(l<=1&&r>=1)puts("1");
            else puts("None.");
        }
        else 
        {
            if(l<=1&&r>=1)
            {
                LL res=1;
               printf("%lld ",res);
                while(res<=r/k)//先进行判断 注意相比较的方法
                {
                    res*=k;
                    printf("%lld ",res);
                }
                cout<<endl;
            }
            else 
            {
                LL maxx = (1ull<<63) - 1;
     
                bool x=0;
                LL res=1;
                while(res<l) {
                    if (res > maxx / k) {
                        maxx = 0;
//                         cout<<"?";
                        break;
                    }
                    res*=k;
                }
                if (maxx == 0) {
                    puts("None.");
                    continue;
                }
               if (res <= r) {
                   printf("%lld ",res);
                   x=1;
               }
                while(res<=r/k)
                {
                    res*=k;
                    printf("%lld ",res);
                    
                    x=1;
                }
                 if(x==0)printf("None.");
                 puts("");
            }
        }
    
    }
     return 0;
}
复制代码

主要是看这里的的解决方法:

 LL maxx = (1ull<<63) - 1;
       if (res > maxx / k) 
对于会爆LL的情况,采用有符号的大数值,采用除法进行判断,那么有符号的最大值可以通过无符号的(1ull<<63)-1得到的
posted on   浅唱\,,笑竹神易  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示