1.二分加速法。
详见求A的B次方
如果常规算的话,肯定会超时。可用二分加速法。
Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
//1.非递归版本
#include<stdio.h>
int ab(int n,int m)
{
int sum;
if(m==1)
return n;
if(n==1)
return 1;
sum=n;
while(m/2)
{
if(m%2==0)
{
n=n%1000;
sum=sum%1000*n;
n=n*n;
m=m/2;
}
else
{
n=n%1000;
sum=sum*n%1000;
sum=sum*n%1000;
n=n*n;
m=m/2;
}
}
return sum%1000;
}
void main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n!=0||m!=0)
{
printf("%d\n",ab(n,m));
}
}
}
//2.递归版本
#include<stdio.h>
int mi(int a,int b)
{
if(b==1)
return a;
if(a==1)
return 1;
if(b%2==0)
{
return mi(a,b/2)*mi(a,b/2)%1000;
}
else
{
return mi(a,(b-1)/2)*mi(a,(b-1)/2)%1000*a%1000;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
printf("%d\n",mi(n,m));
}
return 0;
}
这里看的是函数ab(),用二分加速求a的b次方,大大节省了运算时间。复杂度为logn
也称为幂乘算法,还有个经典应用为求fibonacci数列的第n项:
[fn+1 ,fn;fn,fn-1]=[1,1;1,0]的n次方,然后利用幂乘算,复杂度为logn。(矩阵打不出来)