矩阵乘法练习题doc.docx
- 文档编号:9546686
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:9
- 大小:97.37KB
矩阵乘法练习题doc.docx
《矩阵乘法练习题doc.docx》由会员分享,可在线阅读,更多相关《矩阵乘法练习题doc.docx(9页珍藏版)》请在冰豆网上搜索。
矩阵乘法练习题doc
矩阵乘法练习题
ByMatrix67
好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:
下面的算式则是一个1x的矩阵乘以x的矩阵,得到一个1x的矩阵:
矩阵乘法的两个重要性质:
一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?
废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?
仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么C和A的结果的第i行第j列上的数都等于所有A*E*C的和。
经典题目1给定n个点,m个操作,构造0的算法输
岀m个操作后各点的位置。
操作有平移、缩放、翻转和旋转
这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转,旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时0。
利用矩阵乘法可以在0的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时0o假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、应用这个式子后,规模k减小了一半。
我们二分求出AL后再递归地计算A+A—AJ即可得到原问题的答案。
经典题目V0J1049
题目大意:
顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。
m首先将这m个置换“合并”起来,然后接下来我们需要执行这个置换k/m次。
注意任意一个置换都可以表示成矩阵的形式。
例如,将1置换为1,相当于下面的矩阵乘法:
置换k/m次就相当于在前面乘以k/m个这样的矩阵。
我们可以二分计算出该矩阵的k/m次方,再乘以初始序列即可。
做出来了别忙着高兴,得意之时就是你灭亡之日,别忘了最后可能还有几个置换需要模拟。
经典题目《算法艺术与信息学竞赛》207页
大家自己去看看吧,书上讲得很详细。
解题方法和上一题类似,都是用矩阵来表示操作,然后二分求最终状态。
经典题目给定n和p,求第n个Fibonacci数modp的值,n不超过2
根据前面的一些思路,现在我们需要构造一个x的矩阵,使得它乘以得到的结果是。
每多乘一次这个矩阵,这两个数就会多迭代一次。
那么,我们把这个x的矩阵自乘n次,再乘以就可以得到第n个Fibonacci数了。
不用多想,这个x的矩阵很容易构造出来:
经典题目V0J1067
我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:
在右上角的*的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0o例如,我们可以用下面的矩阵乘法来二分计算f二f-f+f的第k项:
利用矩阵乘法求解线性递推关系的题目我能方案,M我们以M=3为例进行讲解。
假设我们把这个矩形横着放在电脑屏幕上,从右往左一列一列地进行填充。
其中前n-2列已经填满了,第n-1列参差不齐。
现在我们要做的事情是把第n-1列也填满,将状态转移到第n列上去。
由于第n-1列的状态不一样,因此我们需要分情况进行讨论。
在图中,我把转移前8种不同的状态放在左边,转移后8种不同的状态放在右边,左边的某种状态可以转移到右边的某种状态就在它们之间连一根线。
注意为了保证方案不重复,状态转移时我们不允许在第列竖着放一个多米诺骨牌,否则这将与另一种转移前的状态重复。
把这8种状态的转移关系画成一个有向图,那么问题就变成了这样:
从状态111出发,恰好经过n步回到这个状态有多少种方案。
比如,n=2时有3种方案,111->011->111、111->110->111
和111->000->111,这与用多米诺骨牌覆盖3x2矩形的方案对应。
这样这个题目就转化为了我们前面的例题80
经典题目10P0J2778
题目大意是,检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。
合法的DNA只能由ACTG四个字符构成。
题目将给出10个以内的病毒片段,每个片段长度不超过10o数据规模n下面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例,说明怎样像上面的题一样通过构图将问题转化为例题8。
我们找出所有病毒片段的前缀,把n位DNA分为以下7类:
以AT结尾、以AA结尾、以GG结尾、以?
A结尾、以?
G结尾、以?
C结尾和以?
?
结尾。
其中问号表示“其它情况”,它可以是任一字母,只要这个字母不会让它所在的串成为某个病毒的前缀。
显然,这些分类是全集的一个划分。
现在,假如我们已经知道了长度为n-1的各类DNA中符合要求的DNA个数,我们需要求岀长度为n时各类DNA的个数。
我们可以根据各类型间的转移构造一个边上带权的有向图。
例如,从AT不能转移到AA,从AT转移到?
?
有4种方法,从?
A转移到AA有1种方案,从?
A转移到?
?
有2种方案,从GG到?
?
有2种方案等等。
这个图的构造过程类似于用有限状态自动机做串匹配。
然后,我们就把这个图转化成矩阵,让这个矩阵自乘n次即可。
最后输出的是从?
?
状态到所有其它状态的路径数总和。
题样就可以在log的时间里算岀Sn
代码:
Matsum//Ar+Aq+...+A
{
if
returnA;
if
return+sum;
else
returnsum*)+E);
}
:
推出递推式构造矩阵:
nn/2k23nk
:
按题意所给的函数递推构造矩阵:
:
按题目所给的式子算出前几项找规律,不知道有没有更好的数学证明:
:
题意求长为n的挂件一定包含k种颜色的方案数,应该算DP+矩阵优化,第一次这么做竟然1Y,很高兴:
:
按shd崽大牛的话说是隐藏比较深的题,不过在纸上小推了一下就找到了规律:
因为当某个位的左边是1时该位0->1,1->0,左边是0时该位0->0,1->1,不难发现当考虑线性结构的话有f[i]二%,而题目是环形结构,只需对两端的点考虑
特殊情况即可:
f[i]二%n+1])%:
:
A二A+L*A%n+R*A%n这种环形权值改变问题都可以和上题一样构造矩阵来解:
☆以上两题的矩阵都有一个特点就是矩阵的每行都是循环同构的,也就是可以通过对矩阵某一行右移一位从而得到该行的下一行,这样在计算矩阵乘法的时候只需要用。
的时间来计算第一行的相乘后的行向量,再花。
的时间计算出将接下来各行平移复制出即可:
代码如下:
Matoperator*
{
Matc:
for
for
c.mat[i][j]-0;
for
if
c.mat[i][j]=%MOD:
}
for
{
c.ma-c.mat[iT][nT];
for
c.ma-c.mat[iT][jT];
}
returnc:
}
好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:
下面的算式则是一个1x的矩阵乘以x的矩阵,得到一个1x的矩阵:
矩阵乘法的两个重要性质:
一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?
废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?
仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么C和A的结果的第i行第j列上的数都等于所有A*B*C的和。
经典题目1给定n个点,m个操作,构造0的算法输出m个操作后各点的位置。
操作有平移、缩放、翻转和旋转
这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转,旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时0。
利用矩阵乘法可以在0的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时0o假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以,即可一步得出最终点
题目大意:
顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。
m首先将这m个置换“合并”起来,然后接下来我们需要执行这个置换k/m次。
注意任意一个置换都可以表示成矩阵的形式。
例如,将1置换为1,相当于下面的矩阵乘法:
置换k/m次就相当于在前面乘以k/m个这样的矩阵。
我们可以二分计算出该矩阵的k/m次方,再乘以初始序列即可。
做出来了别忙着高兴,得意之时就是你灭亡之日,别忘了最后可能还有几个置换需要模拟。
经典题目《算法艺术与信息学竞赛》207页
大家自己去看看吧,书上讲得很详细。
解题方法和上一题类似,都是用矩阵来表示操作,然后二分求最终状态。
经典题目给定n和p,求第n个Fibonacci数modp的值,n不超过2
根据前面的一些思路,现在我们需要构造一个x的矩阵,使得它乘以得到的结果是。
每多乘一次这个矩阵,这两个数就会多迭代一次。
那么,我们把这个x的矩阵自乘n次,再乘以就可以得到第n个Fibonacci数了。
不用多想,这个x的矩阵很容易构造出来:
经典题目V0J1067
我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:
在右上角的*的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。
例如,我们可以用下面的矩阵乘法来二分计算
f二f-f+f
的第k项:
利用矩阵乘法求解线性递推关系的题目我能编出一卡车来。
这里给出的例题是系数全为1的情况。
经典题目给定一个有向图,问从A点恰好走k步到达B点的方案数modp的值n-1列参差不齐。
现在我们要做的事情是把第n-1列也填满,将状态转移到第n列上去。
由于第n-1列的状态不一样,因此我们需要分情况进行讨论。
在图中,我把转移前8种不同的状态放在左边,转移后8种不同的状态放在右边,左边的某种状态可以转移到右边的某种状态就在它们之间连一根线。
注意为了保证方案不重复,状态转移时我们不允许在第n-1列竖着放一个多米诺骨牌,否则这将与另一种转移前的状态重复。
把这8种状态的转移关系画成一个有向图,那么问题就变成了这样:
从状态111出发,恰好经过n步回到这个状态有多少种方案。
比如,「2时有3种方案,111->011->111、111->110->111和111->000->111,这与用多米诺骨牌覆盖3x2矩形的方案一一对应。
这样这个题目就转化为了我们前面的例题80
后面我写了一份此题的源代码。
你可以再次看到位运算的相关应用。
经典题目10P0J2778
题目大意是,检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。
合法的DNA只能由ACTG四个字符构成。
题目将给岀10个以内的病毒片段,每个片段长度不超过10o数据规模n下面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例,说明怎样像上面的题一样通过构图将问题转化为例题8。
我们找出所有病毒片段的前缀,把n位DNA分为以下7类:
以AT结尾、以AA结尾、以GG结尾、以?
A结尾、以?
G结尾、以?
C结尾和以?
?
结尾。
其中问号表示“其它情况”,它可以是任一字母,只要这个字母不会让它所在的串成为某个病毒的前缀。
显然,这些分类是全集的一个划分。
现在,假如我们已经知道了长度为n-1的各类DNA中符合要求的DNA个数,我们需要求出长度为n时各类DNA的个数。
我们可以根据各类型间的转移构造一个边上带权的有向图。
例如,从AT不能转移到AA,从AT转移到?
?
有4种方法,从?
A转移到AA有1种方案,从?
A转移到?
?
有2种方案,从GG到?
?
有2种方案等等。
这个图的构造过程类似于用有限状态自动机做串匹配。
然后,我们就把这个图转化成矩阵,让这个矩阵自乘n次即可。
最后输出的是从?
?
状态到所有其它状态的路径数总和。
题目中的数据规模保证前缀数不超过100,一次矩阵乘法是三方的,一共要乘log次ongelement[MAX_SIZE][MAX_SIZE];
voidsetSize:
voidsetModulo:
CMatrixoperator*;CMatrixpower:
private:
intsize:
longmodulo:
};
voidCMatrix:
:
setSize
{
for
for
element[i][j]=0;
size-a;
}
voidCMatrix:
:
setModulo
{
modulo-a;
}
CMatrixCMatrix:
:
operator*{
CMatrixproduct;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 乘法 练习题 doc