【洛谷1349】广义斐波那契数列
2017-07-13 17:19
253 查看
4000
需要使用矩阵快速幂
所以
我们需要求出矩阵T
因此,我们可以直接退出最后结果的表达式
然后直接求解就行了
题面
题目描述
广义的斐波那契数列是指形如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。题解
这道题类似于最普通的斐波那契数列的求法需要使用矩阵快速幂
所以
我们需要求出矩阵T
因此,我们可以直接退出最后结果的表达式
然后直接求解就行了
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAX 10 #define ll long long ll p,q,a1,a2,n,MOD; struct yl//矩阵 { int n;//大小 long long g[MAX][MAX]; }A; yl operator *(yl a,yl b)//定义乘法 { int n=a.n; yl cool; memset(cool.g,0,sizeof(cool.g)); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) for(int k=1;k<=n;++k) cool.g[i][j]=(cool.g[i][j]+1ll*a.g[i][k]*b.g[k][j]%MOD)%MOD; cool.n=n; return cool; } void write(yl a) { int n=a.n; for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) cout<<a.g[i][j]<<' '; cout<<endl; } } yl Pow(yl a,long long b)//a的b次方 { if(b==1)return a; yl s=Pow(a,b/2); s.n=a.n; s=s*s; if(b&1)s=s*a; return s; } int main() { cin>>p>>q>>a1>>a2>>n>>MOD; A.n=2; A.g[1][1]=p;A.g[1][2]=1; A.g[2][1]=q;A.g[2][2]=0; yl S=Pow(A,n-2); A.g[1][1]=a2;A.g[1][2]=a1; A.g[2][1]=A.g[2][2]=0; A=A*S; cout<<(A.g[1][1])%MOD<<endl; return 0; }
相关文章推荐
- 洛谷1349 广义斐波那契数列 【矩阵乘法】
- 【洛谷1349】广义斐波那契数列
- 洛谷1349 广义斐波那契数列 【矩阵乘法】
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
- 【u021】广义斐波那契数列
- HDU 5451 广义斐波那契数列
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
- 【矩阵乘法】广义斐波那契数列
- P1349 广义斐波那契数列
- P1349 广义斐波那契数列
- P1349 广义斐波那契数列
- 1574 广义斐波那契数列
- Luogu P1349 广义斐波那契数列
- 斐波那契数列、堆
- 斐波那契数列的快速解法
- 斐波那契数列大数加法
- 斐波那契数列
- 剑指offer09:斐波那契数列
- Python 简单斐波那契数列
- 斐波那契数列