題目分析:ios
對於給出的n,求出斐波那契數列第n項的最後4爲數,當n很大的時候,普通的遞推會超時,這裏介紹用矩陣快速冪解決當遞推次數很大時的結果,這裏矩陣已經給出,直接計算便可spa
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 const int mod = 10000; 6 struct mat{ 7 int m[2][2]; 8 }; 9 10 mat operator * (mat a, mat b){ //重載乘號,同時將數據mod10000 11 mat ret; 12 for(int i = 0; i < 2; i++){ 13 for(int j = 0; j < 2; j++){ 14 long long temp = 0; 15 for(int k = 0; k < 2; k++){ 16 temp += a.m[i][k] * b.m[k][j]; 17 temp %= mod; 18 } 19 ret.m[i][j] = temp; 20 } 21 } 22 return ret; 23 } 24 25 mat pow_mat(mat a, int n){ //矩陣快速冪和快速冪相同(廣義快速冪的思想) 26 mat res = a; 27 while(n){ 28 if(n&1) res = res * a; 29 a = a*a; 30 n >>= 1; 31 } 32 return res; 33 } 34 35 int main(){ 36 int n; 37 while(scanf("%d", &n) !=EOF){ 38 if(n == -1) break; 39 if(n == 0) printf("0\n"); 40 else if(n == 1) printf("1\n"); 41 else if(n == 2) printf("1\n"); 42 else{ 43 mat a; //構造一個初始的矩陣 其n-2次方的m[0][0]就是所求的答案 44 a.m[0][0] = 1; 45 a.m[0][1] = 1; 46 a.m[1][0] = 1; 47 a.m[1][1] = 0; 48 mat ans = pow_mat(a, n-2); //調用矩陣快速冪計算 49 printf("%d\n", ans.m[0][0]); 50 } 51 } 52 return 0; 53 }