Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

Description

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

Input

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

Output

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

Sample Input

1 1 1 1 10 7

Sample Output

6

Http

Luogu:https://www.luogu.org/problem/show?pid=1349

Source

递推,矩阵,快速幂

解决思路

如果熟悉了普通斐波那契数列这道题(如果不知道的话请点击链接,里面还有矩阵的相关知识),那么对于广义的斐波那契数列我们不难想到递推矩阵:

\[T=\begin{bmatrix} p & 1 \\ q & 0 \end{bmatrix}
\]

所以递推方程就是

\[A_i=A_{i-1}*T=\begin{bmatrix} f_{i-1} & f_{i-2}\\ 0 & 0 \end{bmatrix}*\begin{bmatrix} p & 1 \\ q & 0 \end{bmatrix}=\begin{bmatrix} f_i=f_{i-1}*p+f_{i-2}*q & f_{i-1} \\ 0 & 0 \end{bmatrix}
\]

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long const int inf=2147483647; ll n,Mod,p,q,A1,A2; class Matrix//定义矩阵结构体
{
public:
ll M[2][2];
Matrix()
{
memset(M,0,sizeof(M));
}
Matrix(ll Arr[2][2])
{
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
M[i][j]=Arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘法操作
{
Matrix Ans;
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
for (int k=0;k<2;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod;
return Ans;
} int main()
{
cin>>p>>q>>A1>>A2>>n>>Mod;
if (n==1)//1和2的情况特殊处理(虽然我也不知道是否有特殊点)
{
cout<<A1<<endl;
return 0;
}
if (n==2)
{
cout<<A2<<endl;
return 0;
}
n=n-2;
ll a[2][2]={{A2,A1},{0,0}};//初始矩阵
ll b[2][2]={{p,1},{q,0}};
Matrix A(a);
Matrix B(b);
while (n!=0)//快速幂
{
if (n&1)
A=A*B;
B=B*B;
n=n>>1;
}
cout<<A.M[0][0]<<endl;
return 0;
}

Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)的更多相关文章

  1. POJ3070 斐波那契数列递推 矩阵快速幂模板题

    题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...

  2. Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)

    题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3);  求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...

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

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

  4. 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)

    I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...

  5. CodeForces 227E Anniversary (斐波那契的高妙性质+矩阵快速幂)

    There are less than 60 years left till the 900-th birthday anniversary of a famous Italian mathemati ...

  6. 「Luogu 1349」广义斐波那契数列

    更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...

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

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

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

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

  9. 矩阵乘法快速幂 codevs 1574 广义斐波那契数列

    codevs 1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 广义的斐波那契数列是指形如 ...

随机推荐

  1. python基础学习笔记

    #!/usr/bin/env python #coding=utf-8 def login(username): if username=='bill': return 1 else: return ...

  2. java 与操作系统进程同步问题(一)————互斥问题

    最近学校开设了操作系统原理课程,老师要求用任意语言去模拟进程的同步和互斥问题. 在尝试的写了之后,发现这个问题非常有意思,故想记录在博客中,作为自己的学习轨迹. 个人还是比较喜欢用Java语言,所以采 ...

  3. 搞定python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

  4. 使用 zabbix 自动发现监控 MySQL

    介绍 使用 zabbix 的 low-level 自动发现功能完成单主机多端口的监控, 详见low_level_discovery, 整体上监控类似 percona 的 zabbix 监控插件, 不过 ...

  5. 基于Express+Socket.io+MongoDB的即时聊天系统的设计与实现

    记得从高中上课时经常偷偷的和同学们使用qq进行聊天,那时候经常需要进行下载qq,但是当时又没有那么多的流量进行下载,这就是一个很尴尬的事情了,当时就多想要有一个可以进行线上聊天的网站呀,不用每次痛苦的 ...

  6. Java IO流--练习

    1)将若干个Student对象,若干个Teacher对象,写出到d:/0404/a.txt中 2)将该文件中所有Student对象反序列化回来装入List, 所有的Teacher对象反序列化回来转入另 ...

  7. 命令查看服务器SN号

    今天工作的时候,为了检查一台服务器的序列号,没必要在跑到机房里了,所以在系统下就可以看机器序列号了.如下: 1.linux取序列号: 命令执行:dmidecode |grep "Serial ...

  8. 一般处理程序+htm C#l简单的增删查改

    首先引用两个文件一个dll: 数据库表已创建 首先编写数据读取部分 /// <summary> /// 查询 /// </summary> /// <param name ...

  9. 实验:Oracle数据泵导出导入之序列问题

    今天同事提出了一个问题: 使用数据泵expdp导出1个schema,有个表主键是触发器自增的id,导入测试库测试时,发现表里的数据比自增序列的值要大.导致插入数据报错. 最终结论是: 由于数据库先进行 ...

  10. Chapter 5:Spectral-Subtractive Algorithms

    作者:桂. 时间:2017-05-24  10:06:39 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 书中 ...