初二矩阵快速幂定时突袭——总结

矩阵加速入门2#

思路:#

基础的矩阵快速幂题,稍微卡常。

原始矩阵:#

[f2f1]

加速矩阵:#

[1110]

代码:#
Code
L.n=1,L.m=2;
R.n=R.m=2;
L.Mat[1][1]=1;L.Mat[1][2]=1;
R.Mat[1][1]=1;R.Mat[1][2]=1;
R.Mat[2][1]=1;R.Mat[2][2]=0;
Matrix ans=L*QuickPow(R,n-2);
printf("%lld\n",ans.Mat[1][1]);

矩阵加速入门3#

思路:#

题目在 fn1fn2 前分别加上了一个常数,只需把加速矩阵中的常数 1,1 变为 p,q 即可。

原始矩阵:#

[f2f1]

加速矩阵:#

[p1q0]

代码:#
Code
L.n=1,L.m=2;
R.n=R.m=2;
L.Mat[1][1]=1;L.Mat[1][2]=1;
R.Mat[1][1]=p;R.Mat[1][2]=1;
R.Mat[2][1]=q;R.Mat[2][2]=0;
Matrix ans=L*QuickPow(R,n-2);
printf("%lld\n",ans.Mat[1][1]);

矩阵加速入门4#

思路:#

此题为3题的变式,很容易想到将 22 的矩阵变为 55 的矩阵,只是注意快速幂的幂应减去 5

原始矩阵:#

[f5f4f3f2f1]

加速矩阵:#

[p1000001000001000001q0000]

代码:#
Code
L.n=1,L.m=5;
R.n=R.m=5;
L.Mat[1][1]=1;L.Mat[1][2]=1;L.Mat[1][3]=1;L.Mat[1][4]=1;L.Mat[1][5]=1;
R.Mat[1][1]=p;R.Mat[1][2]=1;R.Mat[1][3]=0;R.Mat[1][4]=0;R.Mat[1][5]=0;
R.Mat[2][1]=0;R.Mat[2][2]=0;R.Mat[2][3]=1;R.Mat[2][4]=0;R.Mat[2][5]=0;
R.Mat[3][1]=0;R.Mat[3][2]=0;R.Mat[3][3]=0;R.Mat[3][4]=1;R.Mat[3][5]=0;
R.Mat[4][1]=0;R.Mat[4][2]=0;R.Mat[4][3]=0;R.Mat[4][4]=0;R.Mat[4][5]=1;
R.Mat[5][1]=q;R.Mat[5][2]=0;R.Mat[5][3]=0;R.Mat[5][4]=0;R.Mat[5][5]=0;
Matrix ans=L*QuickPow(R,n-5);
printf("%lld\n",ans.Mat[1][1]);

矩阵加速入门5#

思路:#

此题与 3 题只相差一个 n,考虑如何构造 n。我的想法是将原始矩阵带入 n1 ,在每次相乘时都加上一个自身与 1 即可。

原始矩阵:#

[f2f121]

加速矩阵:#

[p100q00010101011]

代码:#
Code
L.n=1,L.m=4;
R.n=R.m=4;
L.Mat[1][1]=1;L.Mat[1][2]=1;L.Mat[1][3]=2;L.Mat[1][4]=1;
R.Mat[1][1]=p;R.Mat[1][2]=1;R.Mat[1][3]=0;R.Mat[1][4]=0;
R.Mat[2][1]=q;R.Mat[2][2]=0;R.Mat[2][3]=0;R.Mat[2][4]=0;
R.Mat[3][1]=1;R.Mat[3][2]=0;R.Mat[3][3]=1;R.Mat[3][4]=0;
R.Mat[4][1]=1;R.Mat[4][2]=0;R.Mat[4][3]=1;R.Mat[4][4]=1;
Matrix ans=L*QuickPow(R,n-2);
printf("%lld\n",ans.Mat[1][1]);

矩阵加速入门6#

思路:#

多一个 n2 ,考虑在原始矩阵构造进去 n2,思考如何通过加速矩阵得到fn+1

fn+1=pfn+qfn1+(n+1)2+n+1+1

         =pfn+qfn1+n2+2n+1+n+1+1

         =pfn+qfn1+n2+3n+3

如此就得到了 fn+1 的式子。

(n+1)2 就等于 n2+2n+1

原始矩阵:#

[f2f12221]

加速矩阵:#

[p1000q0000101003021030111]

代码:#
Code
L.n=1,L.m=5;
R.n=R.m=5;
L.Mat[1][1]=1;L.Mat[1][2]=1;L.Mat[1][3]=4;L.Mat[1][4]=2;L.Mat[1][5]=1;
R.Mat[1][1]=p;R.Mat[1][2]=1;R.Mat[1][3]=0;R.Mat[1][4]=0;R.Mat[1][5]=0;
R.Mat[2][1]=q;R.Mat[2][2]=0;R.Mat[2][3]=0;R.Mat[2][4]=0;R.Mat[2][5]=0;
R.Mat[3][1]=1;R.Mat[3][2]=0;R.Mat[3][3]=1;R.Mat[3][4]=0;R.Mat[3][5]=0;
R.Mat[4][1]=3;R.Mat[4][2]=0;R.Mat[4][3]=2;R.Mat[4][4]=1;R.Mat[4][5]=0;
R.Mat[5][1]=3;R.Mat[5][2]=0;R.Mat[5][3]=1;R.Mat[5][4]=1;R.Mat[5][5]=1;
Matrix ans=L*QuickPow(R,n-2);
printf("%lld\n",ans.Mat[1][1]);

矩阵加速入门7#

思路:#

这应该是最复杂的一道题了,如 6 题,考虑在原始矩阵构造进去 n3,思考如何通过加速矩阵得到fn+1

fn+1=afn+bfn1+c(n+1)3+d(n+1)2+e

         =afn+bfn1+c(n3+3n2+3n+1)+d(n2+2n+1)+e

         =afn+bfn1+cn3+3cn2+3cn+c+dn2+2dn+d+e

         =afn+bfn1+cn3+(3c+d)n2+(3c+2d)n+c+d+e

如此就得到了 fn+1 的式子。

原始矩阵:#

[f2f1232221]

加速矩阵:#

[a10000b00000c01000d+3c031002d+3c03210c+d+e01111]

代码:#
Code
L.n=1,L.m=6;
R.n=R.m=6;
L.Mat[1][1]=1;L.Mat[1][2]=1;L.Mat[1][3]=8;L.Mat[1][4]=4;L.Mat[1][5]=2;L.Mat[1][6]=1;
R.Mat[1][1]=a;R.Mat[1][2]=1;R.Mat[1][3]=0;R.Mat[1][4]=0;R.Mat[1][5]=0;R.Mat[1][6]=0;
R.Mat[2][1]=b;R.Mat[2][2]=0;R.Mat[2][3]=0;R.Mat[2][4]=0;R.Mat[2][5]=0;R.Mat[2][6]=0;
R.Mat[3][1]=c;R.Mat[3][2]=0;R.Mat[3][3]=1;R.Mat[3][4]=0;R.Mat[3][5]=0;R.Mat[3][6]=0;
R.Mat[4][1]=d+3*c;R.Mat[4][2]=0;R.Mat[4][3]=3;R.Mat[4][4]=1;R.Mat[4][5]=0;R.Mat[4][6]=0;
R.Mat[5][1]=d*2+3*c;R.Mat[5][2]=0;R.Mat[5][3]=3;R.Mat[5][4]=2;R.Mat[5][5]=1;R.Mat[5][6]=0;
R.Mat[6][1]=c+d+e;R.Mat[6][2]=0;R.Mat[6][3]=1;R.Mat[6][4]=1;R.Mat[6][5]=1;R.Mat[6][6]=1;
Matrix ans=L*QuickPow(R,n-2);
printf("%lld\n",ans.Mat[1][1]);

矩阵加速入门8#

思路:#

比较水的一道题,只需修改初始矩阵即与 5 题无区别。

原始矩阵:#

[b(f2)a(f1)21]

加速矩阵:#

[p100q00010101011]

代码:#
Code
L.n=1,L.m=6;
R.n=R.m=6;
L.Mat[1][1]=k2;L.Mat[1][2]=k1;L.Mat[1][3]=2;L.Mat[1][4]=1;
R.Mat[1][1]=p;R.Mat[1][2]=1;R.Mat[1][3]=0;R.Mat[1][4]=0;
R.Mat[2][1]=q;R.Mat[2][2]=0;R.Mat[2][3]=0;R.Mat[2][4]=0;
R.Mat[3][1]=1;R.Mat[3][2]=0;R.Mat[3][3]=1;R.Mat[3][4]=0;
R.Mat[4][1]=1;R.Mat[4][2]=0;R.Mat[4][3]=1;R.Mat[4][4]=1;
Matrix ans=L*QuickPow(R,n-2);
printf("%lld\n",ans.Mat[1][1]);

总结#

失误巨大,将每题的 n 都开成了 int,结果 AK --> 爆零,是一次惨痛的教训。

考后悲伤没有用,希望以后读题,打代码一定细心仔细,不再犯此类低级错误!

posted @   faith_xy  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示