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;
    }
  • 相关阅读:
    Springboot + Mybatis 多数据源配置
    构建微服务:Spring boot 入门篇
    IDEA SpringBoot代码修改热部署/加载
    vue-cli知识点
    vuex知识点
    正则基本知识
    多行SQL语句拼成一条数据
    软件的版本控制
    ASP.NET 表单验证实现浅析
    建造者模式
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6272915.html
Copyright © 2011-2022 走看看