【题解】P8813 题解

2023 年 10 月 15 日更新:增加注释,修改错误的代码。感谢 hexuchen 大佬指出。

2024 年 7 月 31 日更新:没想到两年前写的题解能被这么多人看到,也非常感谢各位的支持!现在评论区中提出了一些问题,这里就这些问题统一回答,并对评论区中有价值的建议对题解进行了修改。

  • Q:方法太复杂了,没必要!

    A:是的,我承认自己当时的考场做法确实较为复杂,相比其他人的做法来看,这个做法显得臃肿而多余。但是我还是想说:这也不失为一种方法。学习 OI,接受一种比较复杂的新思路也是重要的,万一后面这种思想可以被用于其它题目呢?

  • Q:判断 aba^b 是否小于 00,小于 00 代表溢出。看看它溢不溢出就行了。

    A:请注意:带符号整数溢出在 C++ 中是未定义行为,这意味着编译器可以随意地处理这种行为,比如,编译器返回 114514114514 代表溢出也是可以的,所以这种做法有风险,虽不失为一种方法,但在考场上使用务必谨慎。

  • Q:特判 aa 时需考虑 bb 是否大于1,特判 bb 时需考虑 aa 是否大于 11 吗?

    A:不需要。请注意当 aabb 等于 11 时,根据数据范围和 1x=11^x=1 可以肯定答案不会超过 10910^9


P8813 题解

思路分析

这道题主要是特判。

首先我们发现,109=31622\left\lfloor\\\sqrt{10^9}\right\rfloor = 31622log2109=29\left\lfloor\\\log_2{10^9}\right\rfloor = 29。即 a>31622a > 31622b>29b > 29 时必定大于 10910^9。但是注意这是在满足 a,b2a, b \geq 2 时才有的结论。所以注意特判 a=1a = 1b=1b = 1a=1a = 1 时直接输出 11b=1b = 1 时直接输出 aa

但是余下的怎么办呢?显然,当 109an<a\dfrac{10^9}{a^n} < a 时,说明 ana=an+1>109a_n \cdot a = a^{n+1} > 10^9。依此判断即可。由于此时 b29b \le 29,大于 2929 的情况已经被特判掉了,于是直接暴力计算就行。

代码

#include <iostream>
using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    //特判 
    if(a == 1)
    {
        cout << 1 << endl;
        return 0;
    }
    if(b == 1)
    {
        cout << a << endl;
        return 0;
    }
    if(a > 31622)
    {
        cout << -1 << endl;
        return 0;
    }
    if(b > 29)
    {
        cout << -1 << endl;
        return 0;
    }
    long long fac = 1;
    for(int i = 1;i <= b;i++) //i 表示准备乘上第 i 个 a 
    {
        if((1e9 / double(fac)) < a) //准备乘上的时候看看是否超出限制 
        {
            cout << -1 << endl;
            return 0;
        }
        fac *= a;
    }
    cout << fac << endl;
    return 0;
} 
posted @ 2022-11-14 17:43  邻补角-SSA  阅读(25)  评论(0)    收藏  举报  来源