其实我们还可以将这个算法求斐波拉契数列的第10000000项对m取余,这样用到矩阵的乘法,下面给出具体的矩阵推导以及代码。
#include<iostream>
using namespace std;
class Matrix{
public:
int width,height;
Matrix(){
}
Matrix(int hei,int wid){
width = wid; height = hei;
v = new int*[height];
for (int i=0;i<height;i++)
v[i] = new int[width];
}
void set(int hei,int wei){
v = new int*[height];
for (int i=0;i<height;i++)
v[i] = new int[width];
}
int** v;
friend Matrix operator*(Matrix a,Matrix b){
Matrix res(a.height,a.width);
//确保数据正确
//if (a.width!=b.height) retutn res;
for (int i=0;i<a.height;i++){
for (int j=0;j<a.width;j++){
int ans = 0;
for (int k=0;k<a.width;k++){
ans += a.v[i][k]*b.v[k][j];
}
res.v[i][j] = ans;
}
}
return res;
};
friend Matrix operator%(Matrix a,int m){
Matrix ans(a.height,a.width);
for (int i=0;i<a.height;i++)
for (int j=0;j<a.width;j++)
ans.v[i][j] = a.v[i][j] % m;
return ans;
}
};
Matrix a(2,2);
Matrix run(int b,int m){
Matrix t;
if (b==1) return a%m
;
if (b&1){
t=run(b/2,m)%m;
return ((t*t)*a)%m;
}else{
t=run(b/2,m)%m;
return (t*t)%m;
}
}
int main(){
int n,m;
while(1){
cin >> n >> m;
a.v[0][0] = 0; a.v[0][1] = 1; a.v[1][0] = 1; a.v[1][1] = 1;
Matrix ans;
ans = run(n,m);
for (int i=0;i<ans.height;i++){
for (int j=0;j<ans.width;j++)
cout << ans.v[i][j] << " ";
cout << endl;
}
}
system("pause");
return 0;
}
分治就是分而治之的缩写,分治的思想并不局限于这道题,它能极大的提高算法的效率。所以掌握它是十分必要的。