例题(NOI送分题):
求Fi数列的第n项
n<=10的一百万次方
首先,这题很明显是矩阵快速幂,之前的POJ的一个博客里也提到过Fi的第i项,不过n的范围很小,直接用二进制快速幂就可以解决,但是这道题中二进制是肯定解决不了的,所以需要用到十进制快速幂。
一开始做这道题可能很难想到用到十进制快速幂,但是如果对二进制快速幂有十分深刻的理解的话,还是可以写出来的。
我们已知二进制快速幂是通过把幂看作二进制数来处理的,所以我们更可以把幂数当做十进制数处理(废话)。
只需把二进制快速幂简单地改几个数就可以了,先上二进制的:
int pow(int a,int b) { int ans=1; while(b) { if(b&1) ans*=a; a*=a; b>>=1 } return ans; }
然后是十进制的:
int pow(int a,int b) { int ans=1; while(b) { int p=b%10,l=a; if(p) for(int i=1;i<=p;i++) ans*=a; for(int i=1;i<=10;i++) a*=l;//可优化 b/=10; } return ans; }
当然还要取摸的,自己加吧。
当然十进制快速幂在平时还是比二进制的慢很多的,同时你还可以在代码中用二进制快速幂优化。