codevs1574广义斐波那契数列
2024-08-23 20:33:21
1574 广义斐波那契数列
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 钻石 Diamond
题目描述 Description
广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列。今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数。
输入描述 Input Description
输入包含一行6个整数。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内。
输出描述 Output Description
输出包含一行一个整数,即an除以m的余数。
样例输入 Sample Input
1 1 1 1 10 7
样例输出 Sample Output
6
/*
矩阵乘法模板
跟斐波那契差不多
就是初始化难理解
静下心来推推式子,然后明确a1,a2是最后才乘上的就好了
*/
#include<iostream>
#include<cstdio>
#define ll long long using namespace std;
int n,mod,q,p,a1,a2;
struct node
{
ll m[][];
}ans,base; ll init()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return f*x;
} node mul(node a,node b)
{
node tmp;
for(int i=;i<;i++)
for(int j=;j<;j++)
{
tmp.m[i][j]=;
for(int k=;k<;k++)
tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
return tmp;
} void qw(ll n)
{
while(n)
{
if(n&) ans=mul(ans,base);
base=mul(base,base);n>>=;
}
} int main()
{
p=init();q=init();
a1=init();a2=init();
n=init();mod=init();
ans.m[][]=;ans.m[][]=q;
ans.m[][]=;ans.m[][]=p;
base.m[][]=;base.m[][]=q;
base.m[][]=;base.m[][]=p;
n-=;
qw(n); printf("%lld\n",(a1*ans.m[][]%mod+a2*ans.m[][]%mod)%mod);
return ;
}
数据范围及提示 Data Size & Hint
数列第10项是55,除以7的余数为6。
最新文章
- java.io.IOException: mark/reset not supported
- java基础2_运算符,选择语句
- How to implement a neural network
- http协议(一)基础知识
- 【Android 界面效果45】ViewPager源码分析
- using 语句中使用的类型必须可隐式转换为“System.IDisposable”
- notepad++搜索结果不显示line XX的方法
- 织梦调用seotitle
- Hive数据仓库笔记(二)
- Working with bounded Task Flows
- 从__acrt_first_block == header 谈起,记录dll链接不一致的问题
- 如何将数据库中存的树转化为树形列表(以easyui的tree为例)
- CentOS7编译安装php7.1
- SignalR 行实时通信遇到的
- java基础 -- 经典排序
- java集合: jdk1.8的hashMap原理简单理解
- Android事件总线(二)EventBus3.0源码解析
- windows service 的错误 错误 14001:
- centos6.5虚拟机快照技术
- KInect AR沙盒制作的一点小经验