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

    题目描述

    广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列。今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数。

    输入输出格式

    输入格式:

    输入包含一行6个整数。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内。

    输出格式:

    输出包含一行一个整数,即an除以m的余数。

    输入输出样例

    输入样例#1: 
    1 1 1 1 10 7
    
    输出样例#1: 
    6

    说明

    数列第10项是55,除以7的余数为6。

    Solution:

      本题基本算是一道矩阵加速模板了,直接构造一手矩阵:

       egin{bmatrix} a2& a1end{bmatrix} 以及中间矩阵 egin{bmatrix} p & 1 \ q & 0 end{bmatrix}

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define mem(p) memset(&p,0,sizeof(p))
    using namespace std;
    ll pp,q,a1,a2,n,m;
    struct mat{ll a[3][3],r,c;};
    il mat mul(mat x,mat y)
    {
        mat p;
        mem(p);
        for(int i=0;i<x.r;i++)
            for(int j=0;j<y.c;j++)
                for(int k=0;k<x.c;k++)
        p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%m;
        p.r=x.r,p.c=y.c;
        return p;
    }
    il void fast(ll k)
    {
        mat p,ans;
        mem(p),mem(ans);
        p.r=p.c=2;
        p.a[0][0]=pp,p.a[0][1]=1,p.a[1][0]=q;
        ans.r=1,ans.c=2;
        ans.a[0][0]=a2,ans.a[0][1]=a1;
        while(k)
        {
            if(k&1)ans=mul(ans,p);
            k>>=1;
            p=mul(p,p);
        }
        cout<<ans.a[0][0];
    }
    int main()
    {
        ios::sync_with_stdio(0);
        cin>>pp>>q>>a1>>a2>>n>>m;
        if(n==1)cout<<a1%m;
        else if(n==2)cout<<a2%m;
        else fast(n-2);
        return 0;
    }

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define mem(p) memset(&p,0,sizeof(p))
    using namespace std;
    ll pp,q,a1,a2,n,m;
    struct mat{ll a[3][3],r,c;};
    il mat mul(mat x,mat y)
    {
        mat p;
        mem(p);
        for(int i=0;i<x.r;i++)
            for(int j=0;j<y.c;j++)
                for(int k=0;k<x.c;k++)
        p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%m;
        p.r=x.r,p.c=y.c;
        return p;
    }
    il void fast(ll k)
    {
        mat p,ans;
        mem(p),mem(ans);
        p.r=p.c=2;
        p.a[0][0]=pp,p.a[0][1]=1,p.a[1][0]=q;
        ans.r=1,ans.c=2;
        ans.a[0][0]=a2,ans.a[0][1]=a1;
        while(k)
        {
            if(k&1)ans=mul(ans,p);
            k>>=1;
            p=mul(p,p);
        }
        cout<<ans.a[0][0];
    }
    int main()
    {
        ios::sync_with_stdio(0);
        cin>>pp>>q>>a1>>a2>>n>>m;
        if(n==1)cout<<a1%m;
        else if(n==2)cout<<a2%m;
        else fast(n-2);
        return 0;
    }

  • 相关阅读:
    不叹惜、不呼唤我也不哭泣
    WCF笔记(一)Service Layer and Channel Layer
    C#数据结构(四)树和二叉树
    Python and django(四)详解python中的数字和序列
    Python and django(三)python中的对象
    IIS与ASP.NET Http Runtime Pipeline
    迈进程序员的大门
    实例学习SSIS(四)使用日志记录和错误流重定向
    DbUtility alpha1版本发布
    关于ref和out的详细区别。
  • 原文地址:https://www.cnblogs.com/five20/p/8716712.html
Copyright © 2011-2022 走看看