这题的确是个模板

但也要提到有关矩乘的内容:

首先什么是矩阵?

给一个线性变换

F(x)   (她可能就是个函数,定义域为向量集)

她可以把一个N维向量变成M维

那么显然x的每一维都可能影响着F(x)的每一维,于是F(x)这个线性变换就应该是N*M个在每两维间的小映射构成的。

于是我们可以把她写成M行N列的矩阵(M行N列是出于习惯)

所以矩阵是用于形象的表示线性变换的工具;

所以怎么合乎习惯的构造矩阵呢?

举例说明:

如,有一个三元组(3维向量)x{a,b,c}

定义F(x)={a+b,b+c}

那么可以构造矩阵(2*3的):

1 1 0

0 1 1

为什么是她呢?

其实矩阵的第i行表示x的每一维对F(x)的第i维的影响;

矩阵的i行j列,表示x的第j维以什么权值(其实是多少倍)影响F(x)第i维的构造;

x的所有维对F(x)的某一维的影响的和,即是F(x)这一维的结果;

如,对于上文中的矩阵;

把x{a,b,c}扔进去;

得到F(x)={1*a+1*b+0*c,0*a+1*b+1*c}={a+b,b+c}

然后什么是矩阵乘法呢?

线性变换作为一种映射,当然可以复合啦!

比如F(x)把五维向量变成四维,G(x)把四维向量变成三维;

那么G[F(x)]就能把五维向量变成三维了;

设H(x)=G[F(x)];

那么H(x)的矩阵是什么呢?

她是G和F的乘积;

如何相乘?

回到本题开头的例子:

F显然是个4*5的矩阵,G是3*4的

H应该是3*5的(行数前列数后)

由上题给出的理解方式H[i,j](表示H的第i行第j列)

表示x的第j维对H(x)的第i行的影响

影响是怎么产生的呢?

Ej先是按照F第j列影响了F(x)的每一维;

F(x)的每一维又按照G第i列影响了G[F(x)]的第i维;

如下图的两矩阵(左边为G,右边F)

***   **
***   **
***   **
***

复合得

**
**
**
**

标记复合矩阵的某点

**
**
**
**

原矩阵的如下点贡献了复合矩阵的这个点

***   **
***   ** 
***   **
***

所以H[i,j]=F[1,j]*G[i,1]+F[2,j]*G[i,2]+F[3,j]*G[i,3]+....啦

话说,你是可以得知H[i,j]与G,F中的那些值有关,但是你怎么得到具体的公式的呢?

这个公式的证明需要需要用到线性变换的性质——F(x+y)=F(x)+F(y)之类的(还是我之前已经用到了?),

由于篇幅,不好细证,其实举例就能理解的,

(就是这东西很好证,博主我不证啦)

然后是代码:

代码如下:

 #include<cstdio>
#include<cstring>
using namespace std;
struct ss{
long long a[][];
};
ss re;
ss map;
ss ans;
int n;
long long m;
ss mul(ss ,ss );
int Sqr(long long ); int main()
{
int i,j,k;
scanf("%d%lld",&n,&m);
for(i=;i<=n;i++){
for(j=;j<=n;j++)
scanf("%d",&map.a[i][j]);
ans.a[i][i]=;
}
Sqr(m);
for(i=;i<=n;i++){
for(j=;j<=n;j++)
printf("%d ",ans.a[i][j]);
printf("\n");
}
return ;
} int Sqr(long long m)
{
while(m){
if(m&)
ans=mul(ans,map);
m>>=;
map=mul(map,map);
}
} ss mul(ss x,ss y){
int i,j,k;
for(i=;i<=n;i++)
for(j=;j<=n;j++){
re.a[i][j]=;
for(k=;k<=n;k++)
re.a[i][j]=(re.a[i][j]+x.a[i][k]*y.a[k][j])% ;
}
return re;
}

祝AC哟;

洛谷 P3390 【模板】矩阵快速幂的更多相关文章

  1. 【洛谷P3390】矩阵快速幂

    矩阵快速幂 题目描述 矩阵乘法: A[n*m]*B[m*k]=C[n*k]; C[i][j]=sum(A[i][1~n]+B[1~n][j]) 为了便于赋值和定义,我们定义一个结构体储存矩阵: str ...

  2. 3990 [模板]矩阵快速幂 洛谷luogu

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...

  3. ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)

    God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...

  4. 【洛谷 p3390】模板-矩阵快速幂(数论)

    题目:给定n*n的矩阵A,求A^k. 解法:利用矩阵乘法的定义和快速幂解答.注意用负数,但是数据太弱没有卡到我......(P.S.不要在 typedef long long  LL; 前使用 LL. ...

  5. 洛谷 P1965 转圈游戏 —— 快速幂

    题目:https://www.luogu.org/problemnew/show/P1965 居然真的就只是 ( x + m * 10k % n ) % n 代码如下: #include<ios ...

  6. 模板【洛谷P3390】 【模板】矩阵快速幂

    P3390 [模板]矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 矩阵A的大小为n×m,B的大小为n×k,设C=A×B 则\(C_{i,j}=\sum\limits_{k=1}^{n}A_{i, ...

  7. 【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线

    P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...

  8. 洛谷P1939【模板】矩阵加速(数列)+矩阵快速幂

    思路: 这个 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 可以想成: [a(n) ] [1 0 1] [a(n-1)   ] [a(n-1) ] =    ...

  9. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]

    洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 299  Solved: 207 Description 加里敦星球的人 ...

  10. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

随机推荐

  1. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  2. iOS 一张图片引发的崩溃SEGV_ACCERR

    出错日志一直报SEGV_ACCERR,原因原来是第三方库SDWebImage下载图片,远程图片的json文件不对导致的闪退 解决方法: 1.command + B 编译工程(最好在编译工程时,清除下缓 ...

  3. notepad++常用操作梳理

    在  设置---管理快捷键   可以查询/重置快捷键.如下: 工作or学习中最长用到的操作: Ctrl+ALT-C:列编辑Ctrl+U:转换为小写Ctrl+Shift+U:转换为大写Ctrl+B:跳转 ...

  4. (C/C++) FILE 讀寫檔案操作

    在C/C++ 讀寫檔案操作比較常見應該是利用 FILE.ifstream.ofstream 在這篇筆記裡頭記錄 FILE.fstream 使用方法及操作 #include <iostream&g ...

  5. 可以修改类不用重启Tomcat加载整个项目

    修改类不重启Tomcat(不用手动重启) 修改tomcat  conf目录下的server.xml <Context path="/struts2" docBase=&quo ...

  6. [温故]图解java多线程设计模式(二)

    join & interrupt 这俩方法属于线程对象里的方法,属于线程本身的操作. join方法 用于等待一个线程的终止,等待期间将会阻塞,直到被等待的线程终止结束. 所以join可以用来做 ...

  7. 【性能测试】:对WebSphere中间件的监控方式

    1  登录WebSphere控制台 2 选择应用.点击启动和停止来启动和停止应用 3 查看当前活动.点击要查看的项目 4 在开始监测前,先选中服务,点击启动监控将集合状态改为活动的 进入页面后,在页面 ...

  8. <VS2017> 编写VC++单元测试 -(一)新建单元测试工程

    开发人员自己编写单元测试是一个非常好的习惯.单元测试不但能够验证自己所编写的代码是否存在问题,避免提交给测试人员时才发现bug,也可以为将来改动代码的人提供验证代码功能正确性的途径.在我有限的工作生涯 ...

  9. html个人简历

    https://gitee.com/aijiawei3344/codes/g8piyjc3kb7nav4whqd2r79 <!DOCTYPE html> <html> < ...

  10. OPENERP 中自定义模块 找不到的问题

    问题的前提是你写的模块本身没有问题,我自己碰到的情况是在本机运行可以,但是上传到服务器上以后却无论怎么重启服务都找不到模块. 问题的根源在上传的文件权限设置不对: 假设自定义模块为rainsoft_p ...