• 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;
    }
    
  • 相关阅读:
    Golang之字符串格式化
    BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
    BZOJ 3329: Xorequ [数位DP 矩阵乘法]
    BZOJ 1833: [ZJOI2010]count 数字计数 [数位DP]
    HDU2089 不要62 BZOJ1026: [SCOI2009]windy数 [数位DP]
    未完
    [Miller-Rabin & Pollard-rho]【学习笔记】
    BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
    BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]
    BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228694.html
Copyright © 2020-2023  润新知