输出练习
时间限制: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 2022-11-04 22:16  浅唱\,,笑竹神易  阅读(110)  评论(0)    收藏  举报