您的位置:首页 > 其它

矩阵乘+高斯消元专题小结【矩阵乘法】

2013-05-19 15:54 260 查看
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=20851#overview

A-H是矩阵乘

置顶里面有一个struct matrix,平时写题会比较方便。

首先矩阵乘法满足结合律,于是可以用快速幂的方法求矩阵的幂。

matrix expmod(int k)
{
matrix e;//单位矩阵
e.n=a.n;
e.init();
while (k)
{
if(k & 1) e=e*a;
a=a*a;
k>>=1;
}
return e;
}


说到矩阵乘法就不得不提一下斐波那契数列,f[0]=0,f[1]=1,f
=f[n-1]+f[n-2]。

构造矩阵A=[0 1

1 1]

这样很明显有[f(n-1),f(n)] * A = [f(n),f(n+1)](设为B*A=C)

那么,现在我们来考虑如何构造这个矩阵。

首先,矩阵C的第一项是矩阵B的第二项,并且C[1]是B乘A的第一列得到的,那么另A的第一列第二个数为1,其它为0,B[1]*0+B[2]*1能得到C[1],C[2]=B[1]+B[2],那么A的第二列为两个1,得到B[1]*1+B[2]*1=C[2]。

这样要求第K项只要[f[0],f[1]]*A^(k-1)=(f[k-1],f[k])



这里多说一点,有很多人问我矩阵要怎么构造,就算我把构造好的矩阵给他看了还是不明白,对于这种情况,我的建议是自己手动把矩阵乘一遍,乘完了就明白了。



我们对FIB做一个变形,f[0]=0,f[1]=1,f
=f[n-1]+f[n-2]+C(C是常数)

对于这种情况,要把常数也加到矩阵里,构造矩阵如下

[ C,f[n-1],f
] * [ 1 0 1

0 0 1

0 1 1 ] = [ C,f
,f[n+1] ]

A题 HDU 1757

非常简单的构造矩阵,递推关系式非常明显,直接按照上面的方法构造矩阵如下:

0 0 0 0 0 0 0 0 a9

1 0 0 0 0 0 0 0 a8

0 1 0 0 0 0 0 0 a7

0 0 1 0 0 0 0 0 a6

0 0 0 1 0 0 0 0 a5

0 0 0 0 1 0 0 0 a4

0 0 0 0 0 1 0 0 a3

0 0 0 0 0 0 1 0 a2

0 0 0 0 0 0 0 1 a1

B题 HDU 2157

【这题在矩阵专题里错加成3157了,囧】

构造邻接矩阵,假设要走K步求从A到B的方案数就是邻接矩阵的K次方的x[A][B]

这个随便找一本离散数学书应该都有证明,我就不多说了【其实我早就不会证明了我会乱说?

C题 POJ 3233

/article/8683296.html

这题以前写过了

D题 ZOJ 3497

忘记题意了,大约好像是给一个有向图,求恰好走K步是否可以从第一个点到最后一个点。和B题一样的方法,不解释。

为了防止溢出可以把矩阵乘时的+运算改成|运算

E题 HDU 2807

这题简直就是无聊,给了N个城市每个城市是一个K*K的方阵,如果对于三个城市ABC有A*B=C那么A到C有一条长度为1的有向路径,然后给若干询问每次询问求两点间的最短路。无聊死了,直接暴力可过【虽然算复杂度完全不对】

F题 HDU 3483

这题的矩阵构造比较难,http://www.cppblog.com/Yuan/archive/2010/08/13/123268.html

我还是贴个别人的链接吧,当时我按这个推了半天才推出那个矩阵,囧

其实这题的方法就是看看第N+1项比第N项多了什么,做个差以后就明白了

G题 HDU 2276

有一圈的灯,其中0和1分别表示灯的暗亮,灯每秒会以一种规律改变状态,规则是当前一盏灯亮时,就改变状态,否则就不改变状态。

然后求第k秒时的状态。

直接构造关系矩阵然后乘一下,和A题差不多的递推。
H题 HDU 2855

这题我一开始我想用F题那样的方法相邻两项做个差找找规律结果完全找不到。

看了别人的题解发现方法很神奇

首先,(x+1)^n=sigma(c(n,k)x^k),那么,把这里的x换成FIB的递推矩阵,1换成单位矩阵,得到

([0,1;1,1]+[0,1;1,0])^n

然后就是矩阵乘了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: