【快速冪】【矩陣快速冪】
阿新 • • 發佈:2019-02-05
快速冪:
一般求x的n次方,可以直接使用迴圈來O(n)求解,但是效率在一些題目中並不高,因此就有了快速冪這個演算法。簡單來說,當我們筆算123的4次方時,通常會先算123的平方再用所得的數再平方運算,而不是連續乘4次,因為相比3次乘法,2次費的時間更少一點,至少我們心理是這麼覺得的,快速冪正是基於這樣一種思想,程式碼實現如下。
int ksm(int x,int n,int mo)
{
int ans=1;
while(n)
{
if (n&1) ans=(ans*x)%mo;
x=(x*x)%mo;
n>>=1 ;
}
return ans;
}
矩陣快速冪:
這裡以求斐波那契數列為例
int jz_multi (long long x1[3][3],long long x2[3][3])
{
long long c[3][3]={0};
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
c[i][j]=(c[i][j]+(x1[i][k]*x2[k][j])%mo)%mo;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
x1[i][j]=c[i][j];
return 0;
}
int ksm(long long x)
{
while(x)
{
if (x&1) jz_multi(jz_0,jz_1);
jz_multi(jz_1,jz_1);
x>>=1;
}
}