矩阵乘法
fnliren
一位无名没脑老年退役oier
展开
-
Code[VS]3332 数列
Description a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的 值。 Input Description 第一行一个整数T,表示询问个数。 以下T行,每行一个正整数n。 Output Description 每行输出一个非负整数表示答案原创 2016-10-14 13:37:23 · 368 阅读 · 0 评论 -
[bzoj 1898--ZJOI2005]沼泽鳄鱼
潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区。每当雨季来临,这里碧波荡漾、生机盎然,引来不少游客。为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥。这个景点造好之后一直没敢对外开放,原因是池塘里有不少危险的食人鱼。豆豆先生酷爱冒险,他一听说这个消息,立马赶到了池塘,想做第一个在桥上旅游的人。虽...原创 2018-03-26 19:14:23 · 196 阅读 · 0 评论 -
[bzoj 2875--Noi2012]随机数生成器
栋栋最近迷上了随机算法,而随机数是生成随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Me thod)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数X[n]。X[n+1]=(a*X[n]+c)mod m其中mod m表示前面的数除以m的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。...原创 2018-03-14 20:59:17 · 258 阅读 · 0 评论 -
[bzoj 4547]小奇的集合
有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值。(数据保证这个值为非负数)这道题一看到它的范围这么大,操作的方法又那么单一,于是便想到了矩阵乘法。相乘的方式为{1,1,1}{0,0,1}{0,1,1}*{s}{m1}[m2}={s+m1+m2}{m2}{m1+m2}(s为当前的总和,m1为次大值,m2为最大值)。但有一...原创 2018-03-14 19:57:44 · 221 阅读 · 0 评论 -
[hdu 2276]Kiki & Little Kiki 2
有n盏灯围成一圈,编号为1~n。编号为1的灯的左边是编号为n的灯,编号为k(1=0)秒将改变它的状态(就是原来是开的,就关上;原来是关的,就开上)。 现在告诉你这n(2这道题表面上是纯模拟,但实际上看到了它的数据范围,我们就知道了这题做法并没有我们想象的那么简单。不过其实可以发现,每一次原创 2017-12-09 12:58:12 · 199 阅读 · 0 评论 -
[caioj 1486及hdu 2157,利用矩阵乘法解决的经典题目八]多少条路呢??
给定一个有向图,有n个点,m条边。求A点到B点恰好经过k条边的方案数(可走重复边)。这道题表面上是dp,dfs什么的,但实际上是一道矩阵乘法加快速幂的裸题。为什么呢,其实是因为矩阵乘法它那相乘的特殊。首先原创 2017-08-25 12:34:43 · 450 阅读 · 0 评论 -
[caioj 1487及vijos 1194,利用矩阵乘法解决的经典题目九]有趣的domino
问用1*2的多米诺骨牌填满m*n的矩阵有多少种方案,结果需要mod p。这道题看上去跟矩阵乘法八竿子都打不着边,但是我们可以转换模型。其实我们可以将这个m*n矩阵的状态通过位运算转换成二进制状态,具体就是先假设i是前一个状态,而j是这一个状态,那么i状态到j状态的条件就是i or j=k 且 i and j=s[x] (0<=x<8),s[]={0,3,6,12,15,24,27,30};为什么这原创 2017-08-26 16:55:18 · 1768 阅读 · 0 评论 -
[caioj 1488及hdu 1588]Gauss Fibonacci
有一个g数组,f数组。g[i]=k*i+b,k与i都是给定的常数。f[0]=0,f[1]=1,f[i]=f[i-1]+f[i-2] (i>=2)。现在,要你求f[g[0]]+f[g[1]]+…+f[g[n-1]]的值,但可能最后的值会很大,所以结果需要mod M。这题看到了它的数据范围,就令人很容易想到用矩阵乘法加快速幂,但是这是一道有难度的题,耗了我不少时间。它的难点就是如何构造矩阵,对于这个问原创 2017-09-23 14:24:04 · 495 阅读 · 0 评论 -
[bzoj 3240--Noi2013]矩阵游戏
有一个巨大的n行m列的矩阵。这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式: F[1][1]=1 F[i,j]=a*F[i][j-1]+b (j!=1) F[i,1]=c*F[i-1][m]+d (i!=1) 递推式中a,b,c,d都是给定的常数。 现在问你F[n][m]的值是多少。由于最终结果可能很大,原创 2017-09-29 19:45:09 · 298 阅读 · 0 评论 -
[caioj 1480,利用矩阵乘法解决的经典题目二]矩阵无限方
给定一个n行n列的矩阵A,求出A^x的结果,输出的每个数都mod 10^9+7。这道题是矩阵乘法加快速幂的模板题。如果暴力的话,就会超时,时间复杂度为O(x)。所以我们就在矩阵乘法的基础上引入了快速幂,时间复杂度就会大大降低。接下来重点讲一下矩阵乘法的快速幂,首先需要大家弄明白数字的快速幂,然后看一下伪代码的图片,大约就能弄明白矩阵的快速幂了。 这题弄明白快速幂后,就很简单了。#includ原创 2017-08-15 11:32:57 · 432 阅读 · 0 评论 -
关于矩阵乘法
矩阵乘法是什么?顾名思义它是矩阵之间的乘法,不过它可与数字乘法有所不同。它相乘还有一定的条件,如x行y列的矩阵可以跟y行z列的矩阵相乘,也就是说第一个矩阵的列数要跟第二个矩阵的行数一样才能相乘。那么它是怎么相乘的呢?它的方法有点奇怪,假设矩阵C一开始所有的数都为0,矩阵A与矩阵B相乘得到矩阵C,那么C[i][j]+=A[i][k]*B[k][j] (1<=k<=A的列数)。 虽说它的相乘方法有点原创 2017-09-21 20:40:44 · 738 阅读 · 0 评论 -
[bzoj 3231--SDOI2008]递归数列
一个由自然数组成的数列按下式定义: 对于i <= k:a[i]= b[i] 对于i > k: a[i] = c[1]*a[i-1] + c[2]*a[i-2] + …+ c[k]*a[i-k] 其中b[j]和 c[j] (1<=j<=k)是给定的自然数。写一个程序,给定自然数m <= n, 计算a[m] + a[m+1] + a[m+2] + … + a[n], 并输出它除以给定自原创 2017-09-17 15:35:10 · 316 阅读 · 0 评论 -
[caioj 1485及vijos 1067,利用矩阵乘法解决的经典题目七]童年的走格子
有n个格子,从入口出发(注意,入口不是第一个格子,要另外计算),需要走到最后一个格子(即出口,第n个格子)。每走一步可选择走过1~k个格子,求能走到出口的方案数。这道题的主体算法是递推,但是需要矩阵乘法优化。递推公式很简单,就是f[0]=1,f[i]=f[i-1]+f[i-2]+…+f[i-k],看到这种题,应马上想到矩阵优化,因为每次递推的公式是不变的。我们可以先求出f[1],f[2]…,原创 2017-08-24 12:53:50 · 1058 阅读 · 0 评论 -
[caioj 1484及Luogu P1962,利用矩阵乘法解决的经典题目六]Fibonacci数列
给定n,求第n个Fibonacci数mod 10^9+7的值。这道题如果看到了数据范围,就知道了不只模拟那么简单。不错,这题要用矩阵乘法及快速幂,其实这题感觉最大的重点就是构建矩阵,但也挺好推,结果矩阵就是这样{0,1}{1,1}。为什么呢,因为{0,1}{1,1}*{f1}{f2}=(f2}{f3(f1+f2)}(两个相邻括号之间有空行)。最后只要用结果矩阵平方n次,再乘{f0(0)}{f1(1原创 2017-08-22 11:51:25 · 340 阅读 · 0 评论 -
[caioj 1479,利用矩阵乘法解决的经典题目一]点的变换
给定n(n<=10000)个点,m次操作,所有点的坐标都是已知的,现在可能对n个点做以下几种操作: 平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R)。 操作的次数不超过1000000次,求最终所有点的坐标。这道题最主要的算法是矩阵乘法,这些操作都可以转换成一个3*3的矩阵。转换后,首先先将总的操原创 2017-08-14 11:40:29 · 490 阅读 · 0 评论 -
[caioj 1483,利用矩阵乘法解决的经典题目五]成群的细菌
n个培养皿排成一个圈,每个里面都有一些细菌。培养皿逆时针编号为1,2,…,n,第i个培养皿里有a[i]个细菌。细菌不停地活动着,它们有可能会进行六种操作: d i 0,表示第i个培养皿的所有细菌都死亡。 r i k,表示第i个培养皿的每个细菌分裂成k个。 c i j,表示把第j个培养皿的所有细菌复制到第i个培养皿。 t i j,表示把第j个培养皿的所有细菌转移到第i原创 2017-08-19 11:35:00 · 445 阅读 · 0 评论 -
[caioj 1481及poj 3233,利用矩阵乘法解决的经典题目三]矩阵幂级数
给定一个n行n列的矩阵A,求A+A^2+A^3+…+A^k的结果,并且输出的每个数都mod m。这道题非常经典,因为它需要两次快速幂,为什么?首先A^i我们当然可以求出来,可以用快速幂,但如果计算k次就会超时。所以我们要再进行一次,举个例子,A+A^2+A^3+…+A^6,可以转化成A+A^2+A^3+A^3(A+A^2+A^3),这样就可以先二分算出(A+A^2+A^3),然后再乘A^3,便可以原创 2017-08-16 11:36:44 · 1052 阅读 · 0 评论 -
[caioj 1482及vijos 1049,利用矩阵乘法解决的经典题目四]序列无限变
有n个数,也就是说初始序列为1,2,3…n;m种置换方式(有m行),每行有n个数字,这些数字互不相同而且每个数字都在1到n之间。置换操作方式为设这一行操作的第i个数字为a[i],那么就把原来序列中的第a[i]个数放到这个序列的第i的位置上,然后组成新的序列。从第一种置换方式开始操作,一直到最后一种操作,重复上面的操作方式。当最后一种操作结束后,组成了的序列又按照第一种来操作,一直循环下去,直到一共操原创 2017-08-18 11:29:06 · 486 阅读 · 0 评论 -
[bzoj 2326--HNOI2011]数学作业
小C数学成绩优异,于是老师给小C留了一道非常难的数学作业题:给定正整数 N 和 M 要求计算 Concatenate (1 ..N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数。例如,N> = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是...原创 2018-03-27 09:24:38 · 179 阅读 · 0 评论