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

    .

    Solution

    矩阵快速幂

    #include<stdio.h>
    #include<string.h>
    #define md 10000
    long long n;
    struct matrix{
        long long x[2][2];
        matrix operator*(matrix b){
            matrix tmp;
            for(int i=0;i<2;i++)
                for(int j=0;j<2;j++){
                    tmp.x[i][j]=0;
                    for(int k=0;k<2;k++)
                        tmp.x[i][j]=(tmp.x[i][j]+x[i][k]*b.x[k][j])%md;
                }
            return tmp;
        }
    }root,counter;
    void matrix_qpow(long long p){
        for(;p;counter=counter*counter,p>>=1)
            if(p&1)
                root=root*counter;
    }
    int main(){
        scanf("%I64d",&n);
        while(n!=-1){
            counter.x[0][0]=counter.x[0][1]=counter.x[1][0]=1;
            counter.x[1][1]=0;
            root.x[0][0]=root.x[1][1]=1;
            root.x[0][1]=root.x[1][0]=0;
            matrix_qpow(n);
            printf("%I64d
    ",root.x[0][1]);
            scanf("%I64d",&n);
        }
        return 0;
    }
  • 相关阅读:
    Babel:JavaScript编译器
    Webpack:前端资源模块化管理和打包工具
    springboot之RocketMq实现
    spingboot之Java邮件发送
    第一模块总结
    嵌入式面试题(一)
    C/C++练习题(三)
    ToolTip特效 JavaScript 盗取厦门人才网的特效
    C#后台无刷新页面弹出alert方法
    复制表及其只复制表数据的区别
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6272915.html
Copyright © 2011-2022 走看看