zoukankan      html  css  js  c++  java
  • 矩阵乘法学习笔记

    经历了一发被虐以后,我发现我对矩阵乘法一无所知...

    于是开始补坑QAQ

    感觉矩乘貌似写起来不是很麻烦就不放代码了(其实是你懒得写)

    一、基础

    大体过程

    A*B=C —> C_{i,j}=A_{i,k}*B_{k,j}

    我一般的理解方式就是我们在第一个矩阵框一行,然后在第二个矩阵框一列,然后他们的交点的地方就是我们放值的地方。

    这个样子(?)

    矩阵乘法的基本性质

    1.满足结合律->这也是我们可以矩阵快速幂计算答案的基础

    2.不满足交换律,这很显然因为交换以后行列数会变化,然而矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,所以不满足交换律。

    我现在的水平大概用这些就够了(?)以后再补坑

    二、例题

    当然是我们最常规的求斐波那契数列第K项啦

    首先我们写出递推式F(n)=F(n-1)+F(n-2)

    然后我们观察递推式有两项,我们可以用一个2*2的矩阵来写出来

    egin{bmatrix} F_n & F_{n-1}\ F_{n-2} & F_{n-3} end{bmatrix} *egin{bmatrix} 1 &1\1 & 0 end{bmatrix} =egin{bmatrix} F_n+F_{n-1} & F_n\ F_{n-2}+F_{n-3} & F_{n-2} end{bmatrix}

    我们把最后一个矩阵的式子化一下就是egin{bmatrix} F_{n+1} & F_n\ F_{n-1} & F_{n-2} end{bmatrix}

    是不是就是我们想要的式子!!!

    然后我们用快速幂的方法处理第二个矩阵的k-2次幂第一项就是我们的答案啦

    由于笔者水平有限...只会凑数凑矩阵...emm...如果在读这个傻傻的blog的你会更好的办法那么请私信我或者评论!!谢谢orz

    三、练习

    笔者从网上搜罗到的一点题...水平有限求轻喷QAQ

    1.CodeVS1281 Xn数列

    给你6个数,m, a, c, x0, n, g

    Xn+1 = ( aXn + c ) mod m,求Xn

    m, a, c, x0, n, g<=10^18

    应该也是经典题吧(?)我不会QAQ看了一发hzwer学长的题解发现随便构造一下就可以了QAQ

    egin{bmatrix} X_n &C end{bmatrix}*egin{bmatrix} A & 0\ 1 & 1 end{bmatrix}=egin{bmatrix}A*X_n+C & Cend{bmatrix}

    同样后面的式子化简一发就是egin{bmatrix} X_{n+1} & Cend{bmatrix}

    依然可以矩阵快速幂搞定

    2.CH30 摆花

    背景及描述

    艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花。有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了。假定每种花数量无限,求摆花的方案数。

    输入格式

    输入有1+m行,第一行有两个用空格隔开的正整数n、m,m表示花的种类数。接下来的m行,每行有m个字符1或0,若第i行第j列为1,则表示第i种花和第j种花不能排在相邻的位置,输入保证对称。(提示:同一种花可能不能排在相邻位置)。

    输出格式

    输出只有一个整数,为方案数(这个数字可能很大,请输出方案数除以1000000007的余数)。

    还是经典题QwQ依然不会做emm通过这个题找到了一点手感吧QwQ

    我们先写出DP转移方程f_{i,j}=sum f_{i-1,k}(a_{j,k}==1||j==0||k==0)

    我们可以把矩阵a的第0行 第0列全部赋为1然后我们拿这个矩阵直接快速幂就可以了!

    撕烤了一下发现非常有道理QwQ

    3.bzoj2326[HNOI2011]数学作业

    Description

    小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:给定正整数 N 和 M

    要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数。

    例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,

    于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。

    Input

    只有一行且为用空格隔开的两个正整数N和M,

    1≤N≤10^18且1≤M≤10^9.

    Output

    仅包含一个非负整数,表示 Concatenate (1 .. N) Mod M 的值。

    这一题真的是看到了秒了QwQ!然后拿给SCB神犇看,然后他顺手切了...我本来以为我突然灵光乍现...其实是题水啦...QAQ

    写一下转移F_i=F_{i-1}*10^{cnt(i)}+icnt(i)表示位数

    我们发现当N的位数发生变化的时候算起来是不一样的所以我们可以对F分段求

    我们先暴力算出N=10^k的情况。

    然后构造一发矩阵

    egin{bmatrix} F_i & i & 1 end{bmatrix}*egin{bmatrix} 10^k & 0 & 0 \ 1 &1 &0\1&1 &1end{bmatrix}=egin{bmatrix} F_i*10^k+i+1 \ i+1 \ 1 end{bmatrix}=egin{bmatrix} F_{i+1} \ i+1 \ 1 end{bmatrix}

    非常优秀对不对!!!然后我们依然可以矩阵快速幂解决!!!

    预告:bzoj1009 GT考试

    由于笔者这几个题都还没写所以滚粗去写了QAQ

  • 相关阅读:
    SQL Function(方法)
    SQL Cursor(游标)
    SQL Proc(存储过程)/tran(事物)
    AAABBBBCCCC
    Visual Studio2012中搭建WCF项目
    关于抽象工厂模式
    C#面向对象的学习笔记
    休假回来 更博-MySQL以月为单位的客户综合情况表_20161008
    结合Mysql和kettle邮件发送日常报表_20161001
    MySQL-with rollup函数运用 _20160930
  • 原文地址:https://www.cnblogs.com/hanyuweining/p/10321973.html
Copyright © 2011-2022 走看看