[codevs]1250斐波那契数列<矩阵乘法&快速幂>
定义:f0=f1=1, fn=fn-1+fn-2(n>=2)。{fi}称为Fibonacci数列。
输入n,求fn mod q。其中1<=q<=30000。
第一行一个数T(1<=T<=10000)。
以下T行,每行两个数,n,q(n<=109, 1<=q<=30000)
文件包含T行,每行对应一个答案。
3
6 2
7 3
7 11
1
0
10
1<=T<=10000
n<=109, 1<=q<=30000
感谢:这道题卡了一天,最后发现自己是被坑了,我一直以为斐波那契数列f0=0,f1=f2=1,结果这是f0=f1=1;
好吧这只是我智障了,我还是来说说矩阵怎么做吧
首先矩阵乘法的定义:
A和B两个矩阵乘出来是
知道矩阵是怎么样乘后就可以来解决这道题,我们定义一个初始矩阵和单位矩阵

而fn+fn-1=fn+1,所以这就是这道题的关键了
例如我要求f6 就要用初识矩阵*b^5,而初识矩阵ans[1][1]=f1=1,ans[1][2]=f0=1
当数据比较大的时候这个b^n-1次方可能就会爆,所以这又要用到快速幂
然后我们来看个快速幂模板
//求a^b %c
void done(int a,int b,int c)
{
ans=1;
while(b)
{
if(b&)
ans=(ans*a)%c;
a=(a*a)%c;
b>>=;
} }
有了这两个知识,我们就可以实现矩阵快速幂了
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std; long long ans[][],c[][],b[][];
long long n,m,t; void dod(int n)
{
while(n)
{
if(n&)//判断n的奇偶性
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
for(int k=;k<=;k++)
c[i][j]=(c[i][j]+ans[k][j]*b[i][k])%m;//这个地方的i,j,k建议画图分析
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
ans[i][j]=c[i][j];
c[i][j]=;
}
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
for(int k=;k<=;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j])%m;
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
b[i][j]=c[i][j];
c[i][j]=;
}
n>>=; } } int main()
{
cin>>t;
while(t--)
{
scanf("%lld%lld",&n,&m);
b[][]=b[][]=b[][]=;
ans[][]=ans[][]=;
b[][]=;
n--;//fn只需要初识矩阵*b^n-1
dod(n);
printf("%lld\n",ans[][]%m);
} }
讲题略水,如有错误,望诸位大佬指出
[codevs]1250斐波那契数列<矩阵乘法&快速幂>的更多相关文章
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- Codevs 1574 广义斐波那契数列(矩阵乘法)
1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- [luogu 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 ...
- 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造
一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- 51nod1242 斐波那契数列 矩阵快速幂
1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 #include<stdio.h> #define mod 100000000 ...
- POJ3070 斐波那契数列 矩阵快速幂
题目链接:http://poj.org/problem?id=3070 题意就是让你求斐波那契数列,不过n非常大,只能用logn的矩阵快速幂来做了 刚学完矩阵快速幂刷的水题,POJ不能用万能头文件是真 ...
随机推荐
- node中fs模块 - fs.open() fs.read() fs.write() fs.close()
var fs = require('fs') fs.open('./a.txt', 'a+', function(err, fd) { // 打开文件后 创建缓冲区放置数据 ), // 读取多少字节 ...
- Python之接口测试(一)
前言 之前我们已经学会了利用JMeter工具进行接口测试,今天我们学习一下如何利用python进行接口测试. 一:发送get请求 import requests,json url = 'http:// ...
- 后台管理遇到的坑一、style中css样式怎么传入变量值
第一.给标签定义style变量 第二.在data中定义 第三.在methods中的方法中给样式赋值
- 遍历tree
1.解决方法 filterData (arr) { var newArr = [] arr.map((item) => { var childrenArr if (item.children ! ...
- js中 __proto__ 和 prototype
js中的对象都有__proto__属性存在[隐式原型],注意是两个_, 1,javascript对象的__proto__指向的是该对象的构造函数的原型对象,即constructor.prototype ...
- Redis(7)——持久化【一文了解】
一.持久化简介 Redis 的数据 全部存储 在 内存 中,如果 突然宕机,数据就会全部丢失,因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的 持久化机制, ...
- windows7免费永久激活方法分享
前言 我相信,这里肯定有看过我上一篇博客的同学. 我说了,为解决windows7激活问题,我会找一个比较好的方法. 首先先让大家看一看激活前windows7的计算机属性: 显示是未激活的.下面就是方法 ...
- ggplot之多变量绘图
1. 普通plot 准备数据. x<-seq(0,2*pi,0.05) y<-sin(x) z<-cos(x) data<-data.frame(x,y,z) plot: pl ...
- Python数据科学手册(1) IPython:超越Python
1.1 shell还是Notebook Jupyter Notebook 是 IPython shell 基于浏览器的图形界面,提供了一系列丰富的动态展示功能.Jupyter Notebook 不仅可 ...
- Kona JDK 在腾讯大数据领域内的实践与发展
导语 | 近日,云+社区技术沙龙“腾讯开源技术”圆满落幕.本次沙龙邀请了多位腾讯技术专家,深度揭秘了腾讯开源项目TencentOS tiny.TubeMQ.Kona JDK.TARS以及Medical ...