zoukankan      html  css  js  c++  java
  • [洛谷P1349]广义斐波那契数列

    题目大意:设$f[n]=f[n-1]*p+f[n-2]*q(当n>2时)$,给你p,q,f[1],f[2],n,m,求f[n]mod m的值。

    解题思路:明显,递推是会TLE的,我们又得用矩阵加速大法了。

    于是就很简单了。

    $$egin{bmatrix}f[n-1]\f[n]end{bmatrix}quad=egin{bmatrix}0&1\q&pend{bmatrix}^{n-2}quad ×egin{bmatrix}f[0]\f[1]end{bmatrix}quad$$

    时间复杂度$O(log_2 n)$

    C++ Code:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int P,Q,a1,a2,n,m;
    struct mat{
        long long a[30][30];
        int r,c;
    };
    mat mul(mat x,mat y){
        mat ans;
        memset(&ans,0,sizeof ans);
        for(int i=0;i<x.r;++i)
        for(int j=0;j<y.c;++j)
        for(int k=0;k<x.c;++k)
        ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j])%m;
        ans.r=x.r;
        ans.c=y.c;
        return ans;
    }
    void pow(int n){
        mat p;
        memset(&p,0,sizeof p);
        p.r=p.c=2;
        p.a[0][1]=1;
        p.a[1][0]=Q;
        p.a[1][1]=P;
        mat ans;
        memset(&ans,0,sizeof ans);
        ans.r=ans.c=2;
        ans.a[0][0]=ans.a[1][1]=1;
        while(n){
            if(n&1){
                ans=mul(p,ans);
            }
            p=mul(p,p);
            n>>=1;
        }
        p.a[0][0]=a1%m;
        p.a[1][0]=a2%m;
        p.c=1;
        ans=mul(ans,p);
        printf("%d
    ",(int)ans.a[1][0]);
    }
    int main(){
    	scanf("%d%d%d%d%d%d",&P,&Q,&a1,&a2,&n,&m);
        if(n==1)printf("%d
    ",a1%m);else
        if(n==2)printf("%d
    ",a2%m);else
        pow(n-2);
        return 0;
    }
    
  • 相关阅读:
    hisi3516/3519开发(二)—xshell连接串口
    linux svn使用
    IdentityServer4 源码介绍
    想写博客
    # VS2019 快捷键插入当前时间
    # 使用 vscode markdown 遇到的问题
    # 学Vue
    teXt使用
    Linux基础
    NopCommerce(Core)学习目录
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7631393.html
Copyright © 2011-2022 走看看