矩阵乘法

来源:互联网 发布:中日高铁竞争知乎 编辑:程序博客网 时间:2024/05/22 14:14

xsy2041
bzoj4002
题意:

(b+d2)n  mod  7528443412579576937

分析:
构造数列an=(b+d2)n+(bd2)n
xn+yn=(xn1+yn1)(x+y)(xn2+yn2)xy
an=an1ban2b2d4
然后就可以矩乘得到an
由于an 为正整数且|(bd2)n|<1
因此 (bd2)n 只在n为偶数且d!=b 时为正。此时答案需要-1。

bzoj1875
题意:
给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数。
每一步走的时候要求不能走上一条刚刚走的路。

分析:
这道题的思路,主要是构建矩阵的思路很巧妙。我们普通的用矩阵乘法转移是用点来转移,但是这样不能去掉在一个地方逗留的情况。
一个很神奇的做法就是用边来构图(对于一条边i,除去一条边j满足i==(j^1)的情况,与其他的边都相连)转移t-1次,然后同用与起点相连的边构造的一个矩阵(相当于系数矩阵)相乘。最后统计答案,只需将终点相连的边的答案加上即可。

bzoj2165
题意:
给定一张图,求从1开始到达m的权值至少需要遍历多少条边n100
分析:
从每个点出发每走一步的转移矩阵都是一样的,于是可以考虑倍增。求答案时从大到小枚举每个二进制位,更新g,若不存在从1开始长度>=m的路径,这一位就是1。

bzoj2510
题意:
有M个球,一开始每个球均有一个初始标号,标号范围为1~N且为整数,标号为i的球有ai个,并保证Σai=M
每次操作等概率取出一个球(即取出每个球的概率均为1M),若这个球标号为kk<N,则将它重新标号为k + 1;若这个球标号为N,则将其重标号为1。(取出球后并不将其丢弃)
现在你需要求出,经过K次这样的操作后,每个标号的球的期望个数。

分析:
a[x]为编号为x的期望个数,每进行一次操作,球的期望个数就变成了a[x]a[x]m+a[x1]m。于是构造矩阵:
这里写图片描述
再弄一波矩阵快速幂。但是时间复杂度是O(n3logM)n=1000时就爆炸了。
发现这是一个循环矩阵,只要知道第一行就可以知道整个矩阵,于是乎时间复杂度变成了O(n2logM)

bzoj1898
题意:
给出一张无向图,这个图中有一些鱼,他们不同的时间会出现在固定的位置,呈周期性循环(周期只有2,3,4),一个人要在这个图上走,他不能和鱼同时在一个点上。问从s到t走k步有多少种方案。

分析:因为周期只有2,3,4所以12就是一个大周期,每12个时间单位内的路径转移都是一样的,于是构造出12个矩阵将它们相乘变为一个大周期。整个整个周期的就快速幂,剩下的暴力乘。

bzoj1009
题意:
阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0Xi9),他不希望准考证号上出现不吉利的数字。 他的不吉利数学A1A2...Am(0Ai9)有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2...AmA1X1可以为0阿申想知道不出现不吉利数字的号码有多少种。N109,M20

分析:
dp[i][j]表示考号弄到前i位时当前考号的后j位于不吉利考号的前j位相同。
dp[i+1][k]+=dp[i][j]num[j][k]
num[j][k]表示 能匹配到第j位 加一位以后变成 能匹配到第k位 有多少个数符合。
题解1
题解2

bzoj2326
题意:
定义Concatenate(1,N)=1234567……n。比如Concatenate(1,10)=12345678910。给定n和m,求Concatenate(1,n)%m。

分析:
f[i]为Concatenate(i)的大小。
f[i]=f[i1]101+(i1)+1    1i101
f[i]=f[i1]102+(i1)+1    1i102
……
构造矩阵
这里写图片描述
注意分段矩阵运算时不能用分配率。

bzoj2476
题意:
令战场定义为可以从中间某个点向两边单调不增且不是一个长方形的柱子的序列,求周长为p的柱子有多少个。

分析:
令f[n]为周长为2n的战场数 不考虑【不是长方形】这个条件
如果一个战场左右都没有高度为1的柱子,则方案数等价于将最下方一排砍掉的方案数 即f[n-1]
如果一个战场左侧或右侧有一个高度为1的柱子,则方案数等价于砍掉这个高度为1的柱子的方案数 即2*f[n-1]
但是如果一个战场左侧和右侧都有一个高度为1的柱子,那么这个战场被上面那种情况计算了两次,要减掉 方案数是f[n-2]
故得到递推式f[n]=3*f[n-1]-f[n-2] 矩阵乘法搞出来 再减去长方形的方案数 即n-1即可。

bzoj4417     ☆☆☆☆☆
题意:
现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角。每一步它向右跳奇数列,且跳到本行或相邻行。跳越期间,马不能离开棋盘。

分析:
f[i][j]表示马跳到(2i1,j)位置时的方案数。g[i][j]表示马跳到(2i,j)位置时的方案数。于是列出状态转移:

f[i][j]=x=1i1g[x][j1]+x=1i1g[x][j]+x=1i1g[x][j+1]

g[i][j]=x=1if[x][j1]+x=1if[x][j]+x=1if[x][j+1]

将f[i][j]和g[i][j]的定义均改为原来定义的前缀和:
f[i][j]=f[i1][j]+g[i1][j]+g[i1][j1]+g[i1][j+1]
g[i][j]=g[i1][j]+f[i][j]+f[i][j1]+f[i][j+1]

bzoj2126
题意:
在一个圆上均匀分布pq个点A1A2A3ApqAiAj的距离为min(abs(ij)pqabs(ij) ),在上面选任意个点(可以选0个),如果选择的点中存在两个点距离为p或q,就会发生排斥反应,求不发生排斥反应的方案总数。

分析:
将这pq个点看成是p行q列的矩阵,那么题目就转换为相邻的格子不能同时取(包括第一行和最后一行,第一列和最后一列)。因为p10枚举一波发现一列一共只有123种可行的填法,于是构造一个123*123的矩阵快速幂转移一波就好了。

bzoj3610
bzoj1444
bzoj4180
bzoj3329
bzoj4128

循环矩阵

这里写图片描述
对于两个循环矩阵 A 与 B 来说,A + B 也是循环矩阵。AB 也是循环矩阵,并且 AB=BA。这时只要确定第一行就确定了整个矩阵

0 0
原创粉丝点击