• P2699 【数学1】小浩的幂次运算


    原题链接 https://www.luogu.org/problemnew/show/P2699

    P2699 【数学1】小浩的幂次运算

    首先第一眼看这个题就知道要暴力枚举w^i 看是否在区间[l,r]里内就好啦,注意w=1的情况,如果不特判一下它就会一直死循环从而TLE;

    我是先用一次while(w^i<l)除去前面不在区间内的i,然后再来一次while(w^i<=r)输出所有在区间内的i;

    还有就是#7的数据乘出来会爆long long,用unsigned long long 也水不过去,所以我这里用的__int128,也是现学现卖啊qwq:

    关于__int128的几个需要注意的点:

    1.__int128前面有两个下划线;

    2.讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分OJ上是可以编译且能用的。C/C++标准。IO是不认识__int128这种数据类型的,因此要自己实现IO,其他的运算,与int没有什么不同;

    3.__int128不能用 scanf/printf 或 cin/cout 来输入输出的,所以你需要自己写一套输入输出;

    AC代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    __int128 l,r,k;
    __int128 read()                   //自定义__int128的输入(其实就是快读) 
    {
        char ch=getchar();
        __int128 a=0;
        while(ch<'0'||ch>'9')
        {
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            a=(a<<3)+(a<<1)+(ch^'0');
            ch=getchar();
        }
        return a;
    }
    void print(const __int128 x)      //自定义__int128的输出,因为__int128类型的数太大了,所以我们要以字符的形式从高位到低位一个一个输出,具体做法就是递归 
    {
        if(x<0) putchar('-');         //是负数先输出负号‘-’ 
        if(x>9) print(x/10);          //如果x是多位数,我们除以10去找它的高位 
        putchar(x%10+'0');            //最后再输出最后一位,注意后面加上‘0’ 
        return ;                      //返回 
    }
    int main()
    {
        l=read();
        r=read();
        k=read();
        if(k==1)
        {
            if(l<=1&&r>=1) cout<<1;
            else cout<<-1;
            return 0;
        }
        __int128 m=1,flag=1;
        while(m<l)                    //除去前面在区间外的点 
        {
            m*=k;                     //这里一次一次乘过去比每次求k^i要快 
        }
        while(m<=r)                   //输出再区间内的点 
        {
            flag=0;                   //说明有解,标记一下 
            print(m);                 //输出__int128类型的m 
            putchar(' ');         
            m*=k;
        }
        if(flag) cout<<-1;            //判断无解 
        return 0;
    } 

    这个题解应该不是纯正的正解(毕竟我用了__int128),仅作为参考qwq。

  • 相关阅读:
    CMU15-445 Project #2
    CMU15-445 Project #1 Buffer Pool
    挂分原因
    「杂谈」关于斜率优化维护凸包
    「题解」GYM 101620J Justified Jungle
    「题解」AGC 052 B Tree Edges XOR
    C++ MT19937 随机数 限制范围
    「题解」Codeforces 348C Subset Sums
    「学习笔记」联赛数论再学习
    「题解」洛谷 P4597 序列sequence
  • 原文地址:https://www.cnblogs.com/xcg123/p/11004567.html
Copyright © 2020-2023  润新知