4136: 乘方 [CSP-J 2022]
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:9
解决:6
题目描述
小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 和 ,求 的值是多少。
即 个 相乘的值,例如 即为 个 相乘,结果为 。
“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。
小文很快意识到,她的程序里的变量都是 int 类型的。在大多数机器上,int 类型能表示的最大数为 ,因此只要计算结果超过这个数,她的程序就会出现错误。
由于小文刚刚学会编程,她担心使用 int 计算会出现问题。因此她希望你在 的值超过 时,输出一个 -1 进行警示,否则就输出正确的 的值。
然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。
输入
输入共一行,两个正整数 。
输出
输出共一行,如果 的值不超过 ,则输出 的值,否则输出
-1。样例输入 复制
10 9
样例输出 复制
1000000000
提示
数据范围
对于 的数据,保证 。
对于 的数据,保证 。
对于 的数据,保证 ,。
对于 的数据,保证 。
#include<bits/stdc++.h>
using namespace std;
long long mypow(long long a,long long b) {
if (a==1) return 1;
long long ans=1;
for (long long i=1;i<=b;i++) {
ans*=a;
if (ans>1e9) return -1;
}
return ans;
}
int main(){
long long a,b;cin>>a>>b;
cout<<mypow(a,b)<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
/*方法二:倍增法求快速幂-时间复杂度-O(logn) */
long long quickpow(long long a,long long b) {
long long ans=1;
while(1) {
if (b&1) ans *=a;
b >>= 1;
if (b==0) return ans > 1e9?-1:ans;
a *=a;
if(a>1e9) return -1;
}
return ans;
}
int main(){
long long a,b;cin>>a>>b;
cout<<quickpow(a,b)<<endl;
return 0;
}