HDU3117フィボナッチ数(行列の高速指数+数学的な導出)

 

タイトルには2つのケースがあり、n <= 39およびn> 39です。

前者の場合、テーブルが満たされたときにのみ直接出力する必要があります。

後者の場合、最初の4桁と最後の4桁を見つけるには、それぞれ対数演算と行列高速出力である事前知識が必要です。

前者については、元のリンクである誘導式を投稿してください:https : //www.cnblogs.com/Blogggggg/p/7356668.html

 

このようにして、最初の4桁を見つけることができ、最後の4桁については、n番目のフィボナッチ数列の値を計算してから、残りの演算を行う必要があります。

 

 したがって、次のコードがあります。

1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6  名前空間std を使用 ;
7 const int MAXN = 2 ;
8 typedef long long LL;
9 LL fib [ 45 ];
10 void init(){
 11      fib [ 1 ] = 1 ;
12 forint i = 2 ; i <= 40         ; i ++ 13          fib [i] = fib [i- 1 ] + fib [i- 2 ];
14  }
 15  struct Matrix {
 16      LL m [MAXN] [MAXN];
17      Matrix(){
 18          memset(m、0sizeof (m));
19      }
 20  };
21  int型 find_head(INT N){
 22      ダブル T = - 0.5 * log10の(5.0)+ N * log10の((1 + POW(50.5))/ 2);
23      t-= floor(t);
24      double temp = pow(10.0、t + 3 );
25      return  int (temp);
26  }
 27  Matrix multi(Matrix a、Matrix b){
 28      Matrix res;
29      memset(res.m、0sizeof (res.m));
30      forint i = 0 ; i <MAXN; i ++ 31          forint j = 0 ; j <MAXN; j ++ 32              forint k = 0 ; k <MAXN; k ++ 33                  res.m [i] [j] + =(am [i] [k] * bm [k] [j]%10000 );
34      リターン解像度。
35  }
 36 Matrix last(Matrix a、int n){
 37      Matrix res;
38      memset(res.m、0sizeof (res.m));
39      forint i = 0 ; i < 2 ; i ++ 40          res.m [i] [i] = 1 ;
41      while (n){
 42         if(n&1 43              res = multi(res、a);
44          a = multi(a、a);
45          n >> = 1 ;
46      }
 47      return res;
48  }
 49  int main(){
 50      init();
51      LL n;
52      while(cin >> n){
 53          if(n <= 39 54              cout << fib [n] << endl;
55          else {
 56              Matrix ori;
57              ori.m [ 1 ] [ 1 ] = ori.m [ 0 ] [ 1 ] = ori.m [ 1 ] [ 0 ] = 1 ;
58              ori.m [ 0 ] [ 0 ] = 0 ;
59              printf(" %04d ....%04d \ n "、find_head(n)、last(ori、n- 1).m [ 0 ] [ 0 ]%10000 );
60          }
 61      }
 62      return  0 ;
63 }

 

おすすめ

転載: www.cnblogs.com/pureayu/p/12721430.html