zoukankan      html  css  js  c++  java
  • Fibonacci(矩阵)

    Fibonacci

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
     

    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:

    .

     

     

    题意:Fibonacci数列的第n项。

    注意n很大,用矩阵,就可以了。

    题目链接:http://poj.org/problem?id=3070  转载请注明出处:寻找&星空の孩子

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define LL __int64
    #define mod 10000
    struct matrix
    {
        LL mat[2][2];
    };
    
    matrix multiply(matrix a,matrix b)
    {
        matrix c;
        memset(c.mat,0,sizeof(c.mat));
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                if(a.mat[i][j]==0)continue;
                for(int k=0;k<2;k++)
                {
                    if(b.mat[j][k]==0)continue;
                    c.mat[i][k]+=a.mat[i][j]*b.mat[j][k]%mod;
                    c.mat[i][k]%=mod;
                }
            }
        }
        return c;
    }
    
    matrix quicklymod(matrix a,LL n)
    {
        matrix res;
        memset(res.mat,0,sizeof(res.mat));
        for(int i=0;i<2;i++) res.mat[i][i]=1;
        while(n)
        {
            if(n&1)
                res=multiply(a,res);
            a=multiply(a,a);
            n>>=1;
        }
        return res;
    }
    
    int main()
    {
        LL n;
        while(scanf("%I64d",&n)!=EOF)
        {
            if(n==-1)break;
            matrix ans;
            ans.mat[0][0]=1;
            ans.mat[0][1]=1;
            ans.mat[1][0]=1;
            ans.mat[1][1]=0;
    
            if(n==0)
            {
                printf("0
    ");
                continue;
            }
     /*       else if(n==1)
            {
                printf("1
    ");
                continue;
            }*/
    
            else
                ans=quicklymod(ans,n);
    
     /*       for(int i=0; i<2; i++)
            {
                for(int j=0; j<2; j++)
                    printf("%I64d	",ans.mat[i][j]);
                printf("
    ");
            }
            printf("
    ");
    */
            printf("%I64d
    ",ans.mat[1][0]);
        }
        return 0;
    }

    矩阵入门题!

  • 相关阅读:
    SAM4E单片机之旅——17、通过UART进行标准IO
    SAM4E单片机之旅——16、NAND Flash读写
    SAM4E单片机之旅——15、触屏输入与SPI通信
    SAM4E单片机之旅——14、LCD之SMC的配置
    SAM4E单片机之旅——13、LCD之ASF初步
    不重复验证码
    [Vue warn]: Missing required prop: "value"
    iview input 禁止输入特殊字符 ,解决中文输入法中input把拼音输入
    iview tree 绑定数据
    vue render 中遇到的问题
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/4335840.html
Copyright © 2011-2022 走看看