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

    Time limit
    1000 ms
    Memory limit
    65536 kB

    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:

    这里写图片描述

    思路:矩阵快速幂+对10000取余。

    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    
    using namespace std;
    
    struct Matrix // 定义矩阵 
    {
        int a[2][2];
        Matrix()
        {
            memset(a,0,sizeof(a));
        }
    };
    
    Matrix mul(Matrix a,Matrix b)//矩阵乘法+取余 
    {
        Matrix ans;
        for(int i=0; i<2; i++)
        {
            for(int k=0; k<2; k++)
            {
                if(a.a[i][k])
                    for(int j=0; j<2; j++)
                    {
                        ans.a[i][j]+=a.a[i][k]*b.a[k][j];
                        if(ans.a[i][j]>=10000)
                            ans.a[i][j]%=10000;
                    }
            }
        }
        return ans;
    }
    
    int Mypow(int N)
    {
        Matrix mid,re;
        mid.a[0][0] = mid.a[1][1] = 1;
        re.a[0][0] = re.a[1][0] = re.a[0][1] = 1;
        while(N)
        {
            if(N&1)mid = mul(mid,re);
            re = mul(re,re);
            N >>= 1;
        }
        return mid.a[0][1];
    }
    
    int main()
    {
        int N;
        while(scanf("%d",&N) && N!=-1)
        {
            if(N == 0)
            {
                printf("0
    ");
                continue;
            }
            else if(N<3)
            {
                printf("1
    ");
                continue;
            }
            printf("%d
    ",Mypow(N));
        }
        return 0;
    }
  • 相关阅读:
    python的整除,除法和取模对比
    jq禁用双击事件
    jq判断滑动方向
    jq获取下拉框中的value值
    html字符串转换成纯文字
    内层div相对于外层div水平垂直居中以及外层div相对body水平垂直居中
    python获取用户输入
    js判断浏览器是否支持localStorage
    CLR的执行模型
    行人检测2(行人检测的发展历史)
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514234.html
Copyright © 2011-2022 走看看