1.二分加速法(很容易遇到此类题)

来源:互联网 发布:手机号码测吉凶80算法 编辑:程序博客网 时间:2024/06/08 15:38

1.二分加速法。

详见求A的B次方

如果常规算的话,肯定会超时。可用二分加速法。


Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

#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));}}}

这里看的是函数ab(),用二分加速求a的b次方,大大节省了运算时间。复杂度为logn



也称为幂乘算法,还有个经典应用为求fibonacci数列的第n项:

[fn+1 ,fn;fn,fn-1]=[1,1;1,0]的n次方,然后利用幂乘算,复杂度为logn。(矩阵打不出来)

0 0
原创粉丝点击