zoukankan      html  css  js  c++  java
  • XidianOJ 1027 Feibonaqi数列

    题目描述

    北雷老中医不懂 Fibonacci,于是他定义了一种名叫Feibonaqi的数列,数列满足以下要求:
    1.f(0)=0,f(1)=1
    2.f(n)=2f(n-1)+f(n-2),n>1
    那么问题来了,这个数列的第n项是多少呢?
    (不为难大家用高精度了,你只需要将结果对1,000,000,007取模后输出即可)

    输入

    多组数据
    每组数据一行,包含一个整数n,1<n<1,000,000,000

    输出

    每组数据输出一个整数,即为f(n)对1,000,000,007取模后的结果

    --正文
    矩阵快速幂
    怎么求基础的矩阵就是使用线代的知识了(反正我是照着课本按图索骥的)
    话说怎么又是1000000007..
    #include <stdio.h>
    #include <math.h>
    #define MOD 1000000007 
    
    typedef struct {
        long M[2][2];
    } Matrix;
    
    Matrix Ans,Base;
    long n;
    
    Matrix multi(Matrix a,Matrix b){
        Matrix Tmp;
        int i,j,k;
        for (i=0;i<2;i++){
            for (j=0;j<2;j++){
                Tmp.M[i][j] = 0;
                for (k=0;k<2;k++){
                    Tmp.M[i][j] = ( Tmp.M[i][j] + a.M[i][k] * b.M[k][j]) % MOD; 
                }
            }
        }
        return Tmp;
    }
    
    long Fast_Mod(long n){
        Base.M[0][0] = 2; Base.M[0][1] = 1;
        Base.M[1][0] = 1; Base.M[1][1] = 0;
        Ans.M[0][0] = 1; Ans.M[0][1] = 0;
        Ans.M[1][0] = 0; Ans.M[1][1] = 1;
        while (n) {
            if (n & 1){
                Ans = multi(Ans,Base);
            }
            Base = multi(Base,Base);
            n = n >> 1;
        } 
        return Ans.M[0][1];
    }
    
    
    int main(){
        while (scanf("%ld",&n) != EOF){
            printf("%ld
    ",Fast_Mod(n)); 
        } 
        return 0;
        
    } 
  • 相关阅读:
    Java设计模式—模板方法模式
    STM32 常用GPIO操作函数记录
    GPIO 配置之ODR, BSRR, BRR 详解
    STM32F4先设置寄存器还是先使能时钟
    LDR指令的格式:
    printf函数重定向
    stm32F4各个库文件的作用分析
    STM32F4时钟设置分析
    STM32F407存储器和总线架构
    SPI移位寄存器
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/6065478.html
Copyright © 2011-2022 走看看