zoukankan      html  css  js  c++  java
  • poj 3070 Fibonacci 矩阵快速幂

    Description

    In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:

    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

    An alternative formula for the Fibonacci sequence is

    .

    Given an integer n, your goal is to compute the last 4 digits of Fn.

    Input

    The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.

    Output

    For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

    Sample Input

    0
    9
    999999999
    1000000000
    -1

    Sample Output

    0
    34
    626
    6875

    Hint

    As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

    .

    Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix.

                                                                                                           .

    题解:

    按题目要求很容易写出矩阵

    F[n]    0        1  1  

    F[n-1] 0        1  0

    直接上矩阵快速幂即可

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 using namespace std;
     8 typedef long long ll;
     9 const int mod=10000;
    10 int n;
    11 struct matrix
    12 {
    13     ll a[3][3];
    14     matrix(){for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)a[i][j]=0;}
    15     matrix(ll b[3][3]){for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)a[i][j]=b[i][j];}
    16     inline matrix operator *(matrix p){
    17         matrix tmp;
    18         for(int i=1;i<=2;i++)
    19             for(int j=1;j<=2;j++){
    20                 tmp.a[i][j]=0;
    21                 for(int k=1;k<=2;k++)
    22                     tmp.a[i][j]+=a[i][k]*p.a[k][j],tmp.a[i][j]%=mod;
    23             }
    24         return tmp;
    25     }
    26 };
    27 ll work(){
    28     if(n==0)return 0;
    29     if(n==1||n==2)return 1;
    30     n-=2;
    31     ll t[3][3]={{0,0,0},{0,1,1},{0,0,0}};ll sum[3][3]={{0,0,0},{0,1,1},{0,1,0}};
    32     matrix S=matrix(t),T=matrix(sum);
    33     while(n){
    34         if(n&1)S=S*T;
    35         T=T*T;n>>=1;
    36     }
    37     return S.a[1][1];
    38 }
    39 int main()
    40 {
    41     while(scanf("%d",&n))
    42        {
    43             if(n==-1)break;
    44             printf("%lld
    ",work());
    45         }
    46     return 0;
    47 }

     

     

     

     

  • 相关阅读:
    multiprocessing 源码解析 更新中......
    loadrunner 更新中......
    Java IO
    echarts水球图小数点不显示问题+组件默认值
    双柱表格组件
    表格生成后修改echarts图表样式
    vue中引入单张图片+两张壁纸手动切换
    配置全局组件
    vue使用babel-plugin-import按需引入Ant Design View + babel-plugin-component按需引入element-ui
    vue深浅拷贝的思索
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7143281.html
Copyright © 2011-2022 走看看