首页 > 其他分享 >对于两个数相乘的过程中会发生爆LL 的情况,注意这里是爆LL的解决方法

对于两个数相乘的过程中会发生爆LL 的情况,注意这里是爆LL的解决方法

时间:2022-11-04 22:24:46浏览次数:58  
标签:输出 puts LL tree else 相乘 解决 define

输出练习

时间限制: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^41≤T≤104,l\leq rl≤r,0\leq l,r,k<2^{63}0≤l,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得到的

标签:输出,puts,LL,tree,else,相乘,解决,define
From: https://www.cnblogs.com/qianchangxiaozhushenyi/p/16859291.html

相关文章

  • 狠活是什么意思 All In One
    狠活是什么意思AllInOne供销社和大食堂供销社和大食堂又回来了?告诉你咋回事https://www.ixigua.com/7161677782555034149refs©xgqfrms2012-2021www.cnbl......
  • 无人机探测雷达软硬件解决方案
    特点-轻重量、紧凑型雷达-侦测移动车辆和人员-低截获波形设计-日/夜24小时工作应用-要地安全-机场安全设施-机场和安全区域保护-油库保护-边境监控-周界监控-与......
  • ysoserial CommonsColletions5分析
    前言CommonsCollectionsGadgetChainsCommonsCollectionVersionJDKVersionNoteCommonsCollections1CommonsCollections3.1-3.2.11.7(8u71之后已修复不......
  • shell与bash
    内核和操作系统的关系系统内核提供硬件抽象层,硬盘及文件系统控制shellshell是什么Shell在Linux系统中充当的是人与内核(硬件)之间的交互程序,用户通过Shell去命令这些内......
  • ysoserial CommonsColletions4分析
    前言CommonsCollectionsGadgetChainsCommonsCollectionVersionJDKVersionNoteCommonsCollections1CommonsCollections3.1-3.2.11.7(8u71之后已修复不......
  • [oeasy]python0010_hello_world_unix_c历史迷因
    HelloWorld!回忆上次内容我们这次设置了断点设置断点的目的是更快地调试调试的目的是去除​​bug​​别害怕​​bug​​一步步地总能找到​​bug​​这就是程序员基本......
  • [oeasy]python0010_hello_world_unix_c历史迷因
    ​ HelloWorld!回忆上次内容我们这次设置了断点设置断点的目的是更快地调试调试的目的是去除​​bug​​别害怕​​bug​​一步步地总能找到​​bug​​......
  • CodeForces - 914C Travelling Salesman and Special Numbers
    题意:给出一个二进制数a,每次操作将当前数变成其二进制下1的个数,若干次操作后可以将其变为1.给定k,求不大于a的数中,经过k次操作能变成1的数的数量。解:观察一下这个操作,可以求......
  • ysoserial CommonsColletions3分析
    CC3的利用链在JDK8u71版本以后是无法使用的,具体还是由于AnnotationInvocationHandler的readobject进行了改写。而CC3目前有两条主流的利用链,利用TransformedMap或者LazyMa......
  • Timestamp cur = new Timestamp(System.currentTimeMillis());
    Timestampcur=newTimestamp(System.currentTimeMillis());......