zoukankan      html  css  js  c++  java
  • P1962 斐波那契数列(矩阵加速DP)

    题目背景

    大家都知道,斐波那契数列是满足如下性质的一个数列:

    F_n = left{egin{aligned} 1 space (n le 2) \ F_{n-1}+F_{n-2} space (nge 3) end{aligned} ight.Fn={1 (n2)Fn1+Fn2 (n3)

    题目描述

    请你求出 F_n mod 10^9 + 7Fnmod109+7 的值。

    输入格式

    一行一个正整数 nn

    输出格式

    输出一行一个整数表示答案。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    typedef long long ll;
    const int mod=1e9+7;
    int t;
    ll n;
    struct matrix {
        ll m[5][5];
    }ans,base;
    void init () {
        memset(ans.m,0,sizeof(ans.m));
        for (int i=1;i<=2;i++) ans.m[i][i]=1;
        memset(base.m,0,sizeof(base.m)); 
        base.m[1][1]=1;
        base.m[1][2]=1;
        base.m[2][1]=1;
    } 
    matrix mul (matrix a,matrix b) {
        matrix wjm;
        memset(wjm.m,0,sizeof(wjm.m));
        for (int i=1;i<=2;i++)
            for (int j=1;j<=2;j++)
                for (int k=1;k<=2;k++)
                    wjm.m[i][j]=(wjm.m[i][j]+(a.m[i][k]%mod)*(b.m[k][j]%mod)%mod)%mod;
        return wjm;
    }
    void qpow (ll p) {
        while (p) {
            if (p&1) ans=mul(ans,base);
            base=mul(base,base);
            p>>=1;
        }
    }
    int main () {
        scanf("%lld",&n);
        if (n<=2)
            return printf("1
    "),0; 
        init();
        qpow(n);
        printf("%lld
    ",(ans.m[1][2]+mod)%mod);
    }
  • 相关阅读:
    linux 命令 # tar zcvf Work.tar.gz Work
    ODBC
    vmware 与机器共享
    关机!!!
    reador哦
    asp.net的三层架构图
    十大著名黑客——阿德里安拉莫
    十大著名黑客——查德斯德尔曼
    十大著名黑客——埃里克雷蒙德
    十大著名黑客——George Hotz
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13532091.html
Copyright © 2011-2022 走看看