zoukankan      html  css  js  c++  java
  • POJ 3070 Fibonacci(矩阵快速幂)

    Fibonacci
    Time Limit: 1000MS Memory Limit: 65536K
    Total Submissions: 12271 Accepted: 8707
    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

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <math.h>
    #include <stdio.h>
    
    using namespace std;
    const int mod=10000;
    typedef long long int LL;
    LL n;
    struct Node
    {
        int a[3][3];
    };
    Node multiply(Node a,Node b)
    {
        Node c;
        memset(c.a,0,sizeof(c.a));
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                for(int k=0;k<2;k++)
                {
                    (c.a[i][k]+=(a.a[i][j]*b.a[j][k])%mod)%=mod;
                }
            }
        }
        return c;
    }
    Node get(Node a,LL x)
    {
        Node c;
        memset(c.a,0,sizeof(c.a));
        for(int i=0;i<2;i++)
            c.a[i][i]=1;
        for(x;x;x>>=1)
        {
            if(x&1) c=multiply(c,a);
            a=multiply(a,a);
        }
        return c;
    }
    int main()
    {
        while(scanf("%lld",&n)!=EOF)
        {
            if(n==-1)
                break;
            if(n==0)
            {
                printf("0
    ");
                continue;
            }
             Node a;
             a.a[0][0]=1;a.a[0][1]=1;
             a.a[1][0]=1;a.a[1][1]=0;
             a=get(a,n);
             printf("%d
    ",a.a[0][1]);
    
        }
        return 0;
    }
    
  • 相关阅读:
    Linux中使用dd制作文件的.img
    python正则表达式
    使用@property
    Win10添加删除虚拟打印机方法
    jenkins权限
    RedHat7.2下Jenkins的安装配置
    jenkins忘记管理员账号密码的补救方法
    RHEL软件安装
    docker 常用指令(RHLE)
    /var/run/yum.pid 已被锁定,PID 为 4242 的另一个程序正在运行
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228694.html
Copyright © 2011-2022 走看看