原文链接: c++ 斐波那契数列优化 矩阵快速幂
上一篇: python 运行原理 2
下一篇: C++ 构造函数使用场景
第一种 O(2^n)
第二种 O(n)
第三种O(logn)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <time.h>
#define LL long long
LL const MAX = 1e6 + 1;
LL const INF = 1 << 30;
double const EPS = 0.00000001;
using namespace std;
LL fib1(LL n, LL mod){
return n < 2 ? n : (fib1(n - 1, mod) + fib1(n - 2, mod)) % mod;
}
LL fib2(LL n, LL mod){
if (n < 2)
return n;
LL f1 = 0, f2 = 1, f3 = 1;
for (LL i = 2; i <= n; i++){
f3 = (f1 + f2) % mod;
f1 = f2;
f2 = f3;
}
return f3;
}
LL mod = 1000007, n = 200000000;
struct Arr {
LL a1, a2, a3, a4;
Arr(LL a1 = 1, LL a2 = 1, LL a3 = 1, LL a4 = 0) : a1(a1), a2(a2), a3(a3), a4(a4){}
Arr operator * (Arr a){
Arr ans;
ans.a1 = (a1 * a.a1 + a2 * a.a3) % mod;
ans.a2 = (a1 * a.a2 + a2 * a.a4) % mod;
ans.a3 = (a3 * a.a1 + a4 * a.a3) % mod;
ans.a4 = (a3 * a.a2 + a4 * a.a4) % mod;
return ans;
}
};
Arr pow(Arr a, LL n, LL mod){
if (n <= 1)
return a;
if (n == 2)
return a * a;
Arr ans = pow(a, n / 2, mod);
ans = ans * ans;
if (n % 2)
ans = ans * a;
return ans;
}
LL fib3(LL n, LL mod){
if (n < 2)
return n;
Arr a;
Arr b = pow(a, n, mod);
return b.a2;
}
int main(){
{
clock_t start = clock();
printf("%d\n", fib1(40, mod));
clock_t ends = clock();
printf("run1 time:\t%d\n\n", ends - start);
}
{
clock_t start = clock();
printf("%d\n", fib2(n, mod));
clock_t ends = clock();
printf("run2 time:\t%d\n\n", ends - start);
}
{
clock_t start = clock();
printf("%d\n", fib3(n, mod));
clock_t ends = clock();
printf("run3 time:\t%d\n\n", ends - start);
}
return 0;
}
快速幂最快