题目描述
小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a a a 和 b b b,求 a b a^b ab的值是多少。
a b a^b ab即 b 个 a 相乘的值,例如 2 3 2^3 23即为 3 3 3 个 2 2 2 相乘,结果为 2 × 2 × 2 = 8 2 \times 2 \times 2 = 8 2×2×2=8。
“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。
小文很快意识到,她的程序里的变量都是 i n t int int 类型的。在大多数机器上,int 类型能表示的最大数为 2 31 − 1 2^{31} - 1 231−1,因此只要计算结果超过这个数,她的程序就会出现错误。
由于小文刚刚学会编程,她担心使用 int 计算会出现问题。因此她希望你在 a b a^b ab的值超过 10 9 {10}^9 109时,输出一个 − 1 -1 −1 进行警示,否则就输出正确的 a b a^b ab的值。
然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。
输入格式
输入共一行,两个正整数 a , b a, b a,b。
输出格式
输出共一行,如果 a b a^b ab的值不超过 10 9 {10}^9 109,则输出 a b a^b ab的值,否则输出 -1。
样例输入1
10 9
样例输出1
1000000000
样例输入2
23333 66666
样例输出2
-1
说明/提示
对于
10
%
10 \%
10% 的数据,保证
b
=
1
b = 1
b=1。
对于
30
%
30 \%
30% 的数据,保证
b
≤
2
b \le 2
b≤2。
对于
60
%
60 \%
60% 的数据,保证
b
≤
30
,
a
b
≤
10
18
b \le 30,a^b \le {10}^{18}
b≤30,ab≤1018。
对于
100
%
100 \%
100% 的数据,保证
1
≤
a
,
b
≤
10
9
1 \le a, b \le {10}^9
1≤a,b≤109。
分析
理论上来说,最多
b
b
b 次之后就会超过
1
0
9
10^9
109。
a
x
≤
10
9
a^x \le {10}^9
ax≤109,当
a
=
1
a = 1
a=1 时,乘积是
1
1
1 不可能跳出循环,会超时。因此需要特殊判断。
当
a
=
2
a = 2
a=2 时,
a
x
≤
10
9
<
2
31
a^x \le {10}^9 < 2^{31}
ax≤109<231,因此
x
≤
30
x \le 30
x≤30,最多循环
30
30
30次。
当
a
>
2
a > 2
a>2 时,循环次数会越来越少。
所以得出结论:特判
a
=
1
a=1
a=1,否则循环
b
b
b次,每乘一个
a
a
a 判断是否超过
1
0
9
10^9
109,超过输出
−
1
-1
−1,否则输出
a
b
a^b
ab。
下面是代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
if (a == 1)
cout << 1 << endl;
else{
long long s = 1;
for (int i = 1; i <= b; ++i){
s *= a;
if (s > 1e9){
cout << -1 << endl;
return 0;
}
}
cout << s << endl;
}
return 0;
}