zoukankan      html  css  js  c++  java
  • 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景

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

    • f(1) = 1

    • f(2) = 1

    • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)

    题目描述

    请你求出 f(n) mod 1000000007 的值。

    输入输出格式

    输入格式:

    ·第 1 行:一个整数 n

    输出格式:

    第 1 行: f(n) mod 1000000007 的值

    输入输出样例

    输入样例#1: 复制
    5
    输出样例#1: 复制
    5
    输入样例#2: 复制
    10
    输出样例#2: 复制
    55

    说明

    对于 60% 的数据: n ≤ 92

    对于 100% 的数据: n在long long(INT64)范围内。

    感觉自己学的一直是假的矩阵快速幂。。。

    辅助矩阵为

    $egin{bmatrix} 0 & 1 \ 1 & 1 end{bmatrix}$

    #include<cstdio>
    #include<cstring>
    #define int long long 
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++)
    using namespace std;
    const int MAXN=101;
    const int mod=1e9+7;
    char buf[1<<20],*p1=buf,*p2=buf;
    inline int read()
    {
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,k;
    struct Matrix
    {
        int m[MAXN][MAXN];
        Matrix operator * (const Matrix a)const
        {
            Matrix ans={};
            for(int k=1;k<=n;k++)
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        ans.m[i][j]=(ans.m[i][j]+(m[i][k]*a.m[k][j])%mod)%mod;
            return ans;
        }        
        Matrix pow(int p)
        {
            Matrix ans,a=(*this);
            for(int i=1;i<=n;i++) ans.m[i][i]=1;
            while(p)
            {
                if(p&1) ans=ans*a;
                a=a*a;
            //    a.print();
                p>>=1;
            }
            return ans;
        }
        void print()
        {
            for(int i=1;i<=n;i++,puts(""))
                for(int j=1;j<=n;j++)
                    printf("%d ",m[i][j]);
            printf("*******************
    ");
        }
    };
    main()
    {
        #ifdef WIN32
        freopen("a.in","r",stdin);
        #endif
        k=read();n=2;
        Matrix temp,ans;
        temp.m[1][1]=0;temp.m[1][2]=1;
        temp.m[2][1]=1;temp.m[2][2]=1;
        ans.m[1][1]=0;ans.m[1][2]=1;
        ans.m[2][1]=0;ans.m[2][2]=1;
        temp=temp.pow(k);
        ans=ans*temp;
        printf("%d",ans.m[1][1]);
        return 0;
    }
  • 相关阅读:
    从 HTTP 到 HTTPS
    一条很用的MSSQL语句
    MVC中 jquery validate 不用submit方式验证表单或单个元素
    深信服务发布SSL站点
    警告: 程序集绑定日志记录被关闭(IIS7 64位系统)
    Winform中子线程访问界面控件时被阻塞解决方案
    C# Winform中执行post操作并获取返回的XML类型的数据
    vs2010 vs2012中增加JSon的支持
    WebService应用一例,带有安全验证
    C#事件、委托简单示例
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/8629220.html
Copyright © 2011-2022 走看看