4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造


一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了。
关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了。
当k==1时 显然的矩阵乘法 多开一个位置维护前缀和即可。当然也可以 公式法:\(f_1+f_2+...+f_n=f_{n+2}-1\)
证明其 只需要数学归纳法即可。
当k==2时 不难发现 要求出\((f_1+f_2+...f_n)+(f_2+...f_{n+1})+...(f_n+...f_{2n-1})\)
把这个东西 画成图 可以发现是一个平行四边形。
考虑对这个东西求和 我开始想了一个比较麻烦的方法容斥。
可以发现 如果我把整个矩阵都给求出来 只需要减掉不合法方案即可\(f_1\)被多加了n-1次 \(f_2\)被多加了n-2次。
对这种形式求和怎么做?于是 我又构造了一个矩阵 多开两个位置 一个表示普通前缀和 一个表示当前前缀和。
发现这样就能把答案算出来了。
以上和正解毫无关系 只不过是我考试的时候的想法。
以下是正解:
还是考虑k==3 发现刚才的面形成了体 不过类似于平行四边形体?但是在题目角度来说其实是正方体。
对这个东西求和 发现很难 刚才的容斥不能做了。
不过此时可以发现每一面 由上一面加上上一面得到。
转回头看k==2 发现每一条线可以有上面和上上面两条线得到。
此时 我们就可以发现一个非常特殊的条件 每个维度也是由上一个维度给推出来的。
此时我们对于每个维度单独做 然后利用上个维度做当前维度。
这样我们得到了一个klogn的做法。注意此时的矩阵为\(4\cdot 4\)的。
考虑优化。
可以发现求完一个维度之后 我们要求下一个维度。
这个过程还是一个重复的过程。
我们可以不手动调整 而是考虑构造一个矩阵帮我们进行调整。
这个矩阵也很容易构造。
剩下的就是先求出一个维度 然后利用维度生成维度是重复的。
矩阵快速幂来做即可。
总之 构造出来两个矩阵 可以发现 矩阵快速幂这两个矩阵的乘积即可。
非常巧妙。
const int MAXN=110;
int n,k,T,m;
ll f[5],w[5];
struct wy
{
ll a[5][5];
wy(){memset(a,0,sizeof(a));}
wy friend operator *(wy a,wy b)
{
wy c;
rep(1,m,i)rep(1,m,j)rep(1,m,k)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return c;
}
wy friend operator ^(wy a,int p)
{
wy c;
rep(1,m,i)rep(1,m,j)c.a[i][j]=a.a[i][j];
while(p)
{
if(p&1)c=c*a;
a=a*a;p=p>>1;
}
return c;
}
}A,B,C;
int main()
{
freopen("fib.in","r",stdin);
freopen("fib.out","w",stdout);
get(T);
while(T--)
{
get(n);get(k);m=4;
if(n==1){puts("1");continue;}
A.a[1][1]=0;A.a[1][2]=1;A.a[1][3]=0;A.a[1][4]=1;
A.a[2][1]=1;A.a[2][2]=1;A.a[2][3]=1;A.a[2][4]=1;
A.a[3][1]=0;A.a[3][2]=0;A.a[3][3]=1;A.a[3][4]=0;
A.a[4][1]=0;A.a[4][2]=0;A.a[4][3]=0;A.a[4][4]=1;
B.a[3][1]=1;B.a[3][3]=1;B.a[4][2]=1;B.a[4][4]=1;
A=A^(n-2);C=A;
--k;
if(k)
{
A=A*B;
A=A^(k-1);
A=A*C;
}
f[1]=0;f[2]=1;f[3]=0;f[4]=1;
memset(w,0,sizeof(w));
rep(1,m,i)rep(1,m,j)w[i]=(w[i]+f[j]*A.a[j][i])%mod;
putl(w[m]);
}
return 0;
}
4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造的更多相关文章
- P2461 [SDOI2008]递归数列 矩阵乘法+构造
还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...
- 【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法
已知k阶斐波那契序列的定义为 f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1; f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,... 试编写求k阶斐 ...
- k阶斐波那契数列fibonacci第n项求值
已知K阶斐波那契数列定义为:f0 = 0, f1 = 0, … , fk-2 = 0, fk-1 = 1;fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, … ...
- K阶斐波那契数列--------西工大NOJ习题.10
K阶斐波那契数列--------西工大NOJ习题.10 原创不易,转载请说明出处!!! 科普:k阶斐波那契数列的0到n-1项需要有初始值. 其中,0到n-2项初始化为0,第n-1项初始化为1. 在这道 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- 【poj3070】矩阵乘法求斐波那契数列
[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...
- Luogu P1962 斐波那契数列(矩阵乘法模板)
传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...
- 矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列
矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一 ...
- [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
随机推荐
- HDU 5961 传递 题解
题目 我们称一个有向图G是 传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个 竞赛图,当且仅当它是一个有向图且它的 ...
- Caocao's Bridges HDU - 4738 求桥
题目描述 Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. ...
- scrapy框架携带cookie访问淘宝购物车
我们知道,有的网页必须要登录才能访问其内容.scrapy登录的实现一般就三种方式. 1.在第一次请求中直接携带用户名和密码. 2.必须要访问一次目标地址,服务器返回一些参数,例如验证码,一些特定的加密 ...
- 央行数字货币(CBDCs)的互操作性至关重要
CBDCs(央行数字货币)将在我们的有生之年产生重大的金融转变.然而,除非这些工具吸取了法定货币的教训,否则创新将毫无意义.互操作性一直是影响CBDC采用和功能的最重要障碍之一.因此,各国央行在这一理 ...
- 【学习】从.txt文件读取生成编译代码。
string code = null; String projectName = Assembly.GetExecutingAssembly().GetName().Name; // 1. 生成要编译 ...
- NameNode是如何存储元数据的?
1.NN的作用 保存HDFS上所有文件的元数据! 接受客户端的请求! 接受DN上报的信息,给DN分配任务(维护副本数)! 2.元数据的存储 元数据存储在fsiamge文件+edits文件中! fsim ...
- day74 bbs项目☞点赞与评论
目录 一.文章详情展示 1 将侧边栏做成inclusion_tag 二.点赞点踩功能 三.评论功能 整体总结: 在出现bug的时候,先判断是前端bug还是后端bug,再判断bug错误类型,以及报错信息 ...
- php批量 下载图片
<?php set_time_limit(0); $file = fopen("index.csv",'r');$temp = [];$i=0;$firstsku='';wh ...
- 实现new关键字
一.new做了什么 1.创建了一个全新的对象. 2.这个对象会被执行[[Prototype]](也就是__proto__)链接. 3.生成的新对象会绑定到函数调用的this. 4.通过new创建的每个 ...
- Python pip 国内镜像大全及使用办法
Python pip 国内镜像大全及使用办法 一.国内镜像 清华 https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣 pip install -i http://p ...