题目描述

广义的斐波那契数列是指形如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。

我们来通过这个题讲一下斐波那契数列怎么用矩阵乘法来优化吧

我们知道对于斐波那契数列我们有这样的递推式:f[n]=f[n-1]+f[n-2]

通常情况下,我们计算f(n)的时间复杂度就是O(n)(分别计算f(1), f(2) ... f(n - 1)).
但是当n很大又或者还有其他处理的复杂度一叠加便会超时。

所以当n很大的时候,我们的递推式便不起作用了,我们应该像一种办法来优化一下这个递推式,怎么办呢,我们看到这个式子有加,有乘,我们就一般会想到矩阵乘法(这时候就有人会问了,博主,你眼瞎啊,明明就是个加法的式子,你说他有乘法。。。)额、、对于这个问题,我们可以将上面的式子做一个小小的变形,将它变成f[n]=f[n-1]*1+f[n-2]*1,      f[n-1]=f[n-1]*1+f[n-2]*0

我们在这个地方普及一下矩阵乘法优化递推式的特征:形如f(n) = a1 * f(n - 1) + a2 * f(n - 2) + ... + ak * f(n - k)+c (c为常数)

然后我们可以将他组成这样的一个矩阵

然后我们进行矩阵乘法

来,看看代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 100000000
using namespace std;
int n;
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
struct Node
{
    ][];
    Node(){memset(m,,sizeof(m));}
}mb,ans;
int GCD(int a,int b)
{
    ) return a;
    return GCD(b,a%b);
}
Node operator*(Node a,Node b)
{
    Node c;
    ;i<=;i++)
     ;j<=;j++)
      ;k<=;k++)
       c.m[i][j]=(c.m[i][j]%mod+a.m[i][k]*b.m[k][j]%mod)%mod;
    return c;
}
int main()
{
    n=read();n--;
    mb.m[][]=mb.m[][]=mb.m[][]=;
    ans.m[][]=ans.m[][]=;
    while(n)
    {
        &n) ans=ans*mb;
        mb=mb*mb;n>>=;
    }
    cout<<ans.m[][];
    ;
}

矩阵乘法优化斐波那契

对于这个式子,我们可以根据朴素的斐波那契的矩阵乘法的形式将式子推出来

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long q,p,a1,a2,n,mod;
long long read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
struct Node
{
    ][];
    Node(){memset(m,,sizeof(m));}
}begin,ans;
Node operator*(Node a,Node b)
{
    Node c;
    ;i<=;i++)
     ;j<=;j++)
      ;k<=;k++)
       c.m[i][j]=(c.m[i][j]%mod+(a.m[i][k]%mod*b.m[k][j]%mod)%mod)%mod;
    return c;
}
int main()
{
    p=read(),q=read(),a1=read(),a2=read();
    n=read(),mod=read();n-=;
    ans.m[][]=a2,ans.m[][]=a1;
    begin.m[][]=p,begin.m[][]=q,begin.m[][]=;
    while(n)
    {
        ) ans=ans*begin;
        begin=begin*begin;
        n>>=;
    }
    ==) cout<<ans.m[][]%mod;
    ][]%mod;
    ;
}

洛谷——P1349 广义斐波那契数列的更多相关文章

  1. 洛谷P1349 广义斐波那契数列(矩阵快速幂)

    P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...

  2. 洛谷——P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...

  3. 洛谷P1349 广义斐波那契数列

    传送门 话说谁能告诉我矩阵怎么用latex表示…… 差不多就这样 //minamoto #include<iostream> #include<cstdio> #include ...

  4. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  5. P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...

  6. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

  7. P1349 广义斐波那契数列

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

  8. Luogu P1349 广义斐波那契数列

    解题思路 既然广义斐波那契,而且数据范围这么大,那么我们使用矩阵快速幂来进行求解.大家都知道斐波那契的初始矩阵如下 $$\begin{bmatrix}1&1\\1&0\end{bmat ...

  9. 【洛谷P1962】斐波那契数列

    斐波那契数列 题目链接:https://www.luogu.org/problemnew/show/P1962 矩阵A 1,1 1,0 用A^k即可求出feb(k). 矩阵快速幂 #include&l ...

随机推荐

  1. 2017北京国庆刷题Day6 morning

    期望得分:100+100+20=220 实际得分:100+100+20=220 模拟栈 #include<cstdio> #include<cstring> using nam ...

  2. AJAX流程

    创建一个XHR对象 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari ...

  3. .net core 集成 autofac.

    1. Install Install-Package Autofac Install-Package Autofac.Extensions.DependencyInjection 2.Startup ...

  4. 【BZOJ】4596: [Shoi2016]黑暗前的幻想乡

    [题意]给定n个点的无向完全图,有n-1个公司各自分管一部分路,要求所有公司都有修路的生成树数.n<=17. [算法]容斥原理+生成树计数(矩阵树定理) [题解]每个生成树方案是一个公司有无修路 ...

  5. 【CodeForces】899 E. Segments Removal

    [题目]E. Segments Removal [题意]给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数.n<=2*10^6,1<=ai<=10^9. ...

  6. oozie与sqoop的简单案例

    1:拷贝模板 2:拷贝hive用的jar包 方式一: 3:编辑job.properties # # Licensed to the Apache Software Foundation (ASF) u ...

  7. 【leetcode 简单】第四十一题 Excel表列序号

    给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...

  8. go标识符、变量、常量

    标识符 标识符是用来表示Go中的变量名或者函数名,以字母或_开头.后可跟着字母.数字. _ 关键字 关键字是Go语言预先定义好的,有特殊含义的标识符. 变量 1. 语法:var identifier ...

  9. python基础===100盏灯的问题

    闪存里有人这样提问这样: 第一轮操作所有电灯,第二轮操作第2盏,第4盏开关,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推 ...

  10. 72.Edit Distance---dp

    题目链接:https://leetcode.com/problems/edit-distance/description/ 题目大意:找出两个字符串之间的编辑距离(每次变化都只消耗一步). 法一(借鉴 ...