杭电 2035 http://acm.hdu.edu.cn/showproblem.php?pid=2035
借着这道题目学习一下快速幂。
先上直接代码:
即直接相乘后对1000取模即可:
#include <iostream>
using namespace std;
int a,b;
long long k;
int main() {
while(cin>>a>>b) {
if(a==0&&b==0) {
return 0;
} else {
k = 1;
for (int i = 1; i <= b; i++) {
k *= a;
k %= 1000;
}
cout << k << endl;
}
}
return 0;
}
接下来介绍一下快速幂。
快速幂是位运算的一种应用。
可以将多次的求幂简化到复杂度为log(n).
主要是将其求的幂数拆分为二进制数字之和,从而简化运算。
快速幂AC代码:
#include <iostream>
using namespace std;
int a,b;
long long sum;
long long poww(long a,long b,int mod) {
long long r=1;
while(b) {
if(b&1) r=r*a%mod; //b&1即b%2
a=a*a%mod;
b>>=1; //即b/=2
}
return r;
}
int main() {
while(cin>>a>>b) {
if(a==0&&b==0) {
return 0;
} else {
sum=poww(a,b,1000);
}
cout << sum << endl;
}
return 0;
}