一道矩阵乘法的神题 早上的时候我开挂了 想了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维斐波那契数列 矩阵乘法 构造的更多相关文章

  1. P2461 [SDOI2008]递归数列 矩阵乘法+构造

    还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...

  2. 【严蔚敏】【数据结构题集(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阶斐 ...

  3. 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, … ...

  4. K阶斐波那契数列--------西工大NOJ习题.10

    K阶斐波那契数列--------西工大NOJ习题.10 原创不易,转载请说明出处!!! 科普:k阶斐波那契数列的0到n-1项需要有初始值. 其中,0到n-2项初始化为0,第n-1项初始化为1. 在这道 ...

  5. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  6. 【poj3070】矩阵乘法求斐波那契数列

    [题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...

  7. Luogu P1962 斐波那契数列(矩阵乘法模板)

    传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...

  8. 矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列

    矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一 ...

  9. [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

随机推荐

  1. 如何使用CSS创建巧妙的动画提示框

    当你的用户需要一些额外的上下文来放置图标,或者当他们需要一些保证来点击按钮,或者可能是一个复活节彩蛋的标题来搭配一个图片时,工具提示是一个很好的方法来增强用户界面.现在让我们来制作一些动画工具提示,只 ...

  2. 我打算用JAVA实现GB/T32960 监控平台的tcp server

    之前是用golang写得 ,因为对golang不是很熟练,打算基于netty再写一个,开源出来. 如果近期时间宽裕,就准备着手了. 有兴趣的朋友也可以留言一起做.

  3. (二)LVS介绍

    LVS分3种模式  (a)NAT(网络地址映射):通过网络地址转换的方法来实现调度       优点:支持所有操作系统及私有网络,且只需一个公网 IP 地址       缺点:用户请求和响应报文都必须 ...

  4. 从零开始实现multipart/form-data数据提交

    在HTTP服务应用中进行数据提交一般都使用application/json,application/x-www-form-urlencoded和multipart/form-data这几种内容格式.这 ...

  5. jvm之栈、堆

    1. Java Virtual Machine ​ 人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌.就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感 ...

  6. 查看mysql所有命令

  7. sql 增加修改表格属性字段

    1.修改字段默认值 alter table 表名 drop constraint 约束名字 ------注解:删除表的字段的原有约束 alter table 表名 add constraint 约束名 ...

  8. python中os模块用法大全

    os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os.chdir(dirname):改变工作目录到dirname os.path.r ...

  9. How to use the function of bind

    The usage of  bind  is to define a specified scope for called function. Because the key this is easy ...

  10. Python实现性能自动化测试竟然如此简单【颠覆你的三观】

    一.思考 1.什么是性能自动化测试?   性能系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试使用程序代替手工 提升测试效率 性能自动化使用代码模拟大批量用户 让用户并发请求 多页面多用户并发 ...