1)編寫程式,求解a^b。其中b是正整數。
方法1.
//一般求冪演算法,o(r)
public
static
long power1(int a,int
r)
if(r==0)
long res=1;
for(int i=1;i<=r;++i)
return
res;
}
這種使用連乘計算冪值的演算法,複雜度是o(n)。不過如果將連乘拆分為若干相乘的表示式就可以減少做乘法的次數,自然也能提高演算法效率。
方法2:快速冪計算
以a^10為例,一般方法是a^10=a*a*a*a*a*a*a*a*a*a,做9次乘法操作。為了減少乘法操作次數,首先將指數以二進位制形式表示,10的二進位制形式為1010。就有
a^10=a^(0*2^0+1*2^1+0*2^2+1*2^3)=a^(1*2^1+1*2^3)=(a^2)*((a^2)^3)=(a*a)*((a^2)*(a^2)*(a^2)),將乘法操作次數從9次減少為4次,復用了計算結果a^2。
推導公式:ab=ap(n)*2^n+p(n-1)*2^(n-1)+...+p(0)*2^0=ap(n)*2^n*ap(n-1)*2^(n-1)*...ap(i)*2^i...*ap(0)*2^0,其中p(i)是對應的二進位制位,如果是0,對應的項在計算的時候可以省略。另外有a^(2^i)=a^(2^(i-1)*2)=a^((2^(i-1))^2)。
快速冪的**如下:
publicstatic
long quickpower(long a,int
k)
if(0==k)
long ans=1;
while (k!=0)
a*=a;
k/=2;
}return
ans;
}
時間複雜度是o(log n)。
遞迴求解冪運算的**:
//遞迴冪計算,o(log r)
public
static
long power2(int a,long
r)
if(0==r)
boolean flag=false
;
if(0l==r%2l
)
long val=flag?r/2l:(r-1)/2l
;
if(flag)
else
}
2)快速冪取模演算法
(a^b)%c=((a%c)^b)%c。快速冪取模演算法是rsa演算法的核心,其**實現如下:
publicstatic
long quickpower(long a,int k,int
m)
if(0==k)
long ans=1
;
while (k!=0
) a=(a*a)%m;
k/=2
; }
return
ans;
}
3)使用矩陣快速冪求解斐波那契數列(**如下:
1public
static
long fibonacci4(intk)6
long c=,};//
單位矩陣,代替快速冪中的ans=1
7long a=,};//
待求冪的矩陣,對應快速冪中的a
8while (k!=0
)12 a=multiply(a,a);
13 k/=2;14
}15return c[0][0]+c[0][1
];1617}
1819
public
static
long multiply(long a,long
b)
演算法時間複雜度是o(log n),雖然包含矩陣乘法,不過,矩陣始終是2*2的方陣,並不會隨著輸入規模的增大而有所變化。
另外三種方法求解斐波那契數列。
1//二分遞迴求斐波那契數列,將大問題需要拆分為兩個子問題,然後分別通過遞迴呼叫求解,這就是二分遞迴。
2public
static
int fibonacci1(int
k)//
o(2^k),利用斐波那契數列通項公式求得。大量重複計算56
//線性遞迴。o(n)
7public
static
long fibonacci2( long
k)14
long intpairs=fibonacci2(k-1
);15
long temp=intpairs[1
];16 intpairs[1]=intpairs[0
];17 intpairs[0]+=temp;
18return
intpairs;19}
2021
//遞推求解,o(n)
2223
public
static
long fibonacci3(long
k)27
long prevalue1=0;28
long prevalue2=1;29
long sum=0;30
for(int i=2;i<=k;++i)
36return
sum;
37 }
矩陣快速冪 斐波那契數列
time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...
矩陣快速冪 斐波那契數列
先來實現乙個矩陣相乘的函式吧。const int mod 10000 struct mat mat mat mul mat x,mat y 實現兩個矩陣相乘,返回的還是乙個矩陣。return res 其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪 int pow int...
斐波那契數列 矩陣快速冪
輸入格式 輸入乙個正整數n 1 n 1e18 輸出格式 輸出乙個數,數列的第n項 輸入樣例1 1輸出樣例1 1輸入樣例2 3輸出樣例2 2 一 矩陣相乘 若a為n k矩陣,b為k m矩陣,則它們的乘積將是乙個n m矩陣。兩個矩陣能相乘的前提條件為前乙個矩陣的列數等於後乙個矩陣的行數。兩矩陣相乘的 如...