Codevs 1574 广义斐波那契数列(矩阵乘法)
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
数据范围及提示 Data Size & Hint
数列第10项是55,除以7的余数为6。
分类标签 Tags
矩阵乘法 数论
/*
矩阵乘法快速幂.
矩阵还是比较好推的.....
要时刻想清楚最后的答案记在哪儿.
然后W了好几次.
ans先赋值乘一次.n-1.
把答案放在后边的话A1到An显然乘了n-2次....
*/
#include<iostream>
#include<cstdio>
#define MAXN 3
#define LL long long
using namespace std;
LL p,q,a1,a2,n,m;
LL a[MAXN][MAXN],ans[MAXN][MAXN],c[MAXN][MAXN],b[MAXN][MAXN];
void mi(int n)
{
while(n)
{
if(n&1)
{
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+ans[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
ans[i][j]=c[i][j],c[i][j]=0;
}
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
b[i][j]=c[i][j],c[i][j]=0;
n>>=1;
}
}
void slove()
{
a[1][1]=a1,a[1][2]=a2;
b[1][2]=ans[1][2]=q,b[2][1]=ans[2][1]=1,
b[2][2]=ans[2][2]=p;
mi(n);
printf("%lld",(a[1][1]*ans[1][2]%m+a[1][2]*ans[2][2]%m)%m);
}
int main()
{
scanf("%d%d%d%d",&p,&q,&a1,&a2);
cin>>n;cin>>m;
n-=3;
slove();
return 0;
}
/*
结果在前边.
多乘一次.
*/
#include<iostream>
#include<cstdio>
#define MAXN 3
#define LL long long
using namespace std;
LL p,q,a1,a2,n,m;
LL a[MAXN][MAXN],ans[MAXN][MAXN],c[MAXN][MAXN],b[MAXN][MAXN];
void mi(int n)
{
while(n)
{
if(n&1)
{
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+ans[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
ans[i][j]=c[i][j],c[i][j]=0;
}
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j]%m)%m;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
b[i][j]=c[i][j],c[i][j]=0;
n>>=1;
}
/*for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c[i][j]=(c[i][j]+a[i][k]*ans[k][j]%m)%m;*/
}
void slove()
{
a[1][1]=a1,a[1][2]=a2;
b[1][2]=ans[1][2]=q,b[2][1]=ans[2][1]=1,
b[2][2]=ans[2][2]=p;
mi(n);
printf("%lld",(a[1][1]*ans[1][1]%m+a[1][2]*ans[2][1]%m)%m);
}
int main()
{
scanf("%d%d%d%d",&p,&q,&a1,&a2);
cin>>n;cin>>m;
n-=2;
slove();
return 0;
}
Codevs 1574 广义斐波那契数列(矩阵乘法)的更多相关文章
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- P1349 广义斐波那契数列(矩阵乘法)
题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- P1349 广义斐波那契数列(矩阵加速)
P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...
- [codevs]1250斐波那契数列<矩阵乘法&快速幂>
题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...
- 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造
一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...
- codevs1574广义斐波那契数列
1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p* ...
- 「Luogu 1349」广义斐波那契数列
更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...
随机推荐
- while循环,格式化输出,运算符及编码初识
一.while循环 1.基本循环(死循环) while 条件: 循环体 2.使用while计数 count = 0 # 数字里面非零的都为True while True: count = count ...
- python中sort和sorted用法的区别
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列 一,最简单的排序 1.使用sort排序 my_list = [3 ...
- Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制
服务模型 首先,Istio作为一个(微)服务治理的平台,和其他的微服务模型一样也提供了Service,ServiceInstance这样抽象服务模型.如Service的定义中所表达的,一个服务有一个全 ...
- 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务
来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...
- 怎样发出一个HTTP请求
需要使用 xhr.send(); 参数为请求数据体, 如果没有就传入null, 一般来说, GET请求是不用传参的, POST就视情况而定, 理论上所有GET请求都可以改为POST, 反之则不行. v ...
- 5-MySQL DBA笔记-开发技巧
第5章 开发技巧 本章将介绍一些和数据库相关的开发技巧.由于开发领域很广,这里只选取部分比较常见的小技巧.5.1 存储树形数据 有时我们需要保存一些树形的数据结构,比如组织架构.话题讨论.知识管理.商 ...
- thinkphp 4.8 漏洞测试
首先要部署环境 这里利用docker的方便部署性,来直接找个现成的 git clone https://github.com/vulnspy/thinkphp-5.1.29.git 下载安装后, ...
- 【opencv源码解析】 三、resize
resize.cpp void cv::resize( InputArray _src, OutputArray _dst, Size dsize, double inv_scale_x, doubl ...
- python现状
自从官方宣布 2020 年 1 月后不再更新维护 Python2,已经有一大批开源软件将其抛弃.今天,抛弃 Python2 的名单上又多了一个重磅软件.Python2 是 Python 官方在 200 ...
- ASP.NET如何接收清楚缓存的通知
1 如果使用cache的add方法或者接受CacheItemPriority值得Insert方法重载接收通知,可以提供CacheItemRemovedCallBack对象,选择在清除对象时接收通知 u ...