zoukankan      html  css  js  c++  java
  • 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:

    .

    Source

    Stanford Local 2006
    很简单的矩阵快速幂,几乎就是一道模板试手题,原理学过矩阵乘法的都知道,就不再赘述了。
    直接上代码:
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #define ll long long
    int gi()
    {
        int x=0,y=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
                y=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return x*y;
    }
    int n;
    struct ju
    {
        ll a[145][145];
        inline ju operator *(const ju &b)const
        {
            ju tmp;
            for(int i=1; i<=2; i++)
                for(int j=1; j<=2; j++)
                {
                    tmp.a[i][j]=0;
                    for(int k=1; k<=2; k++)
                    {
                        tmp.a[i][j]+=a[i][k]*b.a[k][j];
                        tmp.a[i][j]%=10000;
                    }
                }
            return tmp;
        }
    } ans;
    ju pow(ju a,int k)
    {
        ju tmp=a;
        while(k!=0)
        {
            if(k&1)
                tmp=tmp*a;
            a=a*a;
            k>>=1;
        }
        return tmp;
    }
    using namespace std;
    int main()
    {
        while(1)
        {
            n=gi();
            if(n==-1)
                return 0;
            ans.a[1][1]=1;
            ans.a[1][2]=1;
            ans.a[2][1]=1;
            ans.a[2][2]=0;
            ans=pow(ans,n);
            printf("%lld
    ",ans.a[2][2]);
        }
    }
    
    //        FOR C.H

     

    PEACE
  • 相关阅读:
    结对项目:四则运算
    Word Count(C语言)
    自我介绍+软工5问
    如何在博客园中使用markdown
    如何设计一门语言(九)——类型
    如何设计一门语言(八)——异步编程和CPS变换
    如何设计一门语言(七)——闭包、lambda和interface
    时隔多年我又再一次体验了一把跟大神聊天的感觉
    20199107 2019-2020-2 《网络攻防实践》第4周作业
    20199107 2019-2020-2 《网络攻防实践》第3周作业
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/7148282.html
Copyright © 2011-2022 走看看