快速幂
Exponentiation by squaring
参考于:https://zhuanlan.zhihu.com/p/95902286
2 n \mathop{2^n} 2n = 2 n / 2 \mathop{2^{n/2}} 2n/2 x 2 n / 2 \mathop{2^{n/2}} 2n/2 = ( 2 n / 4 ) 2 \mathop{{(2^{n/4}})^2} (2n/4)2 x ( 2 n / 4 ) 2 \mathop{{(2^{n/4}})^2} (2n/4)2…
本来100次计算,现在log100=6、7次即可
时间复杂度 = log(n)
//递归快速幂(对大素数取模)
#define MOD 1000000007
typedef long long ll;
ll qpow(ll a, ll n)
{
if (n == 0)
return 1;
else if (n % 2 == 1)
return qpow(a, n - 1) * a % MOD;
else
{
ll temp = qpow(a, n / 2) % MOD;
return temp * temp % MOD;
}
}
非递归
把n=10,10的二进制=1010=2+8
2
10
\mathop{2^{10}}
210 =
2
(
1010
)
2
\mathop{2^{(1010)_2}}
2(1010)2 =
2
2
\mathop{2^2}
22 x
2
8
\mathop{2^8}
28
int qpow(int a, int n){ // a = 2
int ans = 1;
while(n){
if(n&1) // 如果n的当前末位为1
ans *= a; // ans乘上当前的a
a *= a; // a自乘
n >>= 1; // n往右移一位
}
return ans;
}
斐波拉切
题目 https://www.luogu.com.cn/problem/P1962
递归
public static int FibonacciDigui(int n){
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return FibonacciDigui(n - 1) + FibonacciDigui(n - 2);
}
计算量
2
n
\mathop{2^n}
2n
非递归法1
public static int getFibonacciNum(int n){
int first = 1;
int second = 1;
int fn = 1;
for (int i = 2; i < n; i++) {
fn = first + second;
first = second;
second = fn;
}
return fn;
}
非递归法2 - 快速幂