例題(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; }
當然還要取摸的,自己加吧。
當然十進制快速冪在平時還是比二進制的慢很多的,同時你還可以在代碼中用二進制快速冪優化。