hdu4965 巧用矩阵乘法结合律
题意:
给两个矩阵,n*m的矩阵A,和m*n的矩阵B,
求(A*B)^(n*n)其中 m<=6,n<=1000。
思路:
一开始直接模拟,写了个矩阵快速幂,超时了,因为A*B后得到的是1000*1000的矩阵,做乘法直接超时了,后来写了个这样的
(A*B)^(n*n) = (A*B)*(A*B)*(A*B)...
= A * (B*A)*(B*A)*(B*A)...*B
矩阵虽然没有交换律但是有结合律,我们直接先B*A(得到的是一个最大6*6的矩阵)然后快速幂,然后再A * BA^(n*n-1) * B这样就行了,然后又超时了,算了很多次,感觉不可能超时,但还是超时了,原因就是我所有的矩阵用的都是mat[1002][1002]为了方便我都开结构体了,结果各种超时,最后没办法了,全都开数组,然后去模拟,A[1002][8],B[8][1002],BA[8][8]...,这样就AC了,难道开大的数组也会浪费很多时间?(这个地方头一次碰到)。
#include<stdio.h> #include<string.h> typedef struct {int mat[8][8]; }AA;int A[1002][8] ,B[8][1002] ,C[1002][1002]; int nmm[1002][8];AA mat_matba(int n ,int m) {AA c;memset(c.mat ,0 ,sizeof(c.mat)); for(int k = 1 ;k <= n ;k ++)for(int i = 1 ;i <= m ;i ++)if(B[i][k])for(int j = 1 ;j <= m ;j ++)c.mat[i][j] = (c.mat[i][j] + B[i][k] * A[k][j])%6 ;return c; }AA mat_mat(AA a ,AA b ,int n) {AA c;memset(c.mat ,0 ,sizeof(c.mat));for(int k = 1 ;k <= n ;k ++)for(int i = 1 ;i <= n ;i ++)if(a.mat[i][k])for(int j = 1 ;j <= n ;j ++)c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % 6;return c; }AA quick_mat(AA a ,int b ,int n) {AA c;memset(c.mat ,0 ,sizeof(c.mat));for(int i = 1 ;i <= n ;i ++)c.mat[i][i] = 1;while(b){if(b&1) c = mat_mat(c ,a ,n);a = mat_mat(a ,a ,n);b >>= 1;}return c; }void mat_matnmm(AA mm ,int n ,int m) {memset(nmm ,0 ,sizeof(nmm));for(int k = 1 ;k <= m ;k ++)for(int i = 1 ;i <= n ;i ++)if(A[i][k]) for(int j = 1 ;j <= m ;j ++)nmm[i][j] = (nmm[i][j] + A[i][k] * mm.mat[k][j]) % 6; }void mat_matnmmn(int n ,int m) {memset(C ,0 ,sizeof(C));for(int k = 1 ;k <= m ;k ++)for(int i = 1 ;i <= n ;i ++)for(int j = 1 ;j <= n ;j ++)C[i][j] = (C[i][j] + nmm[i][k] * B[k][j]) % 6; } int main () {int n ,m ,i ,j;while(~scanf("%d %d" ,&n ,&m) && n + m){for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)scanf("%d" ,&A[i][j]);for(i = 1 ;i <= m ;i ++)for(j = 1 ;j <= n ;j ++)scanf("%d" ,&B[i][j]);AA c = mat_matba(n ,m);AA ban = quick_mat(c ,n*n-1 ,m);mat_matnmm(ban ,n ,m);mat_matnmmn(n ,m);int sum = 0;for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++)sum += C[i][j];printf("%d\n" ,sum);}return 0; }
hdu4965 巧用矩阵乘法结合律相关推荐
- ACM-ICPC 2018 江苏站 I. T-shirt (含矩阵乘法结合律证明)
链接 https://nanti.jisuanke.com/t/28873 题目来源 The 2018 ACM-ICPC China JiangSu Provincial Programming Co ...
- 矩阵乘法结合律的证明(Proof of (AB)C = A(BC))
记得有人说学高等数学的人遇到证明题通常会在心里感慨: 1. 这么难也能证明? 2. 这么明显也需要证明? 证明题虽然繁琐,费脑筋,但对于一门科学而言,是必不可少的. 今天来看看矩阵乘法结合律的证明过程 ...
- 矩阵乘法结合律的理解
矩阵相似是同一个变换在不同基下的描述. 参考: https://spaces.ac.cn/archives/1777 这篇文章给出了关于矩阵相似的比较直观的理解, "矩阵是线性空间中的线性变 ...
- 矩阵快速幂的一份小结
矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的 ...
- 每日黑巧携品牌全球代言人王一博发布新一代健康巧克力
上海2021年9月14日 /美通社/ -- 众所周知,新消费赛道已经与热战场画上等号,在日新月异的市场脱颖而出,已然成为各大品牌的研究课题.争夺品牌升级的力量,永远藏在产品创新中. 2021年9月14 ...
- 首发:吴恩达的 CS229的数学基础(线性代数),有人把它做成了在线翻译版本!...
本文是斯坦福大学 CS 229 机器学习课程的基础材料,是斯坦福各大人工智能课程的数学基础,本文为线性代数部分,原始文件下载[1] 原文作者:Zico Kolter,修改:Chuong Do, Ten ...
- CS229 机器学习课程复习材料-线性代数
本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...
- 计算机图形学(三)-图形学中的基本变换(缩放、平移、旋转、剪切、镜像)
图形学中的基本变换 1. 二维变换 1.1 缩放变换 1.2.镜像变换 1.3 剪切变换 1.4 旋转变换 1.5 平移变换 1.5.1 什么是线性变换 1.5.2 平移变换(仿射变换) 1.5.3 ...
- 机器学习的数学基础(一)
三道试题 第一题 不是序 从15年开始真正接触机器学习,也尝试着看了一些书,比如<机器学习>(周志华).<统计机器学习>(李航).<机器学习实战>等等:一直对于相关 ...
最新文章
- devc++64位不兼容_DNF玩家遭强制脱坑,只因64位更新后无法上游戏,如何解决?...
- spring-boot-starter-parent 作用
- 第一阶段:Java基础之异常和处理
- JS 新建web sql 数据表
- 微软职位内部推荐-Software Development Engineer 2
- idea启动tomcat时蓝屏
- 源码--常用的人脸识别数据库
- 电脑屏保海底世界_电脑游戏假面骑士kiva中文版
- 记Python的一些用法
- 理解的三极管输出特性曲线图的放大区和饱和区,利用∆Ic小于∆βIb差值比较曲线左移右移关系
- try except Exception as e 检查异常
- MTCNN + Deep_Sort实现多目标人脸跟踪之MTCNN人脸检测部分(一)
- 数据库中关于preparedStatement和Statement分析
- 机器学习的几个重要问题
- Servlet中ServletConfig接口和ServletContext接口的作用
- 解决IDEA 打不开问题
- linux 汇编 preserve8,ARM汇编伪指令
- Xgboost近似分位数算法
- Win7共享无线 实现iPad 2 WiFi上网
- Arduino与Proteus仿真实例-密码门禁控制仿真
热门文章
- 1012: [JSOI2008]最大数maxnumber
- Hadoop权威指南阅读笔记
- 全面讲述linux集群负载均衡
- 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作
- 解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题...
- python---4
- Android 阻隔返回键
- CodeForces - 981G Magic multisets
- win bat 输入参数
- div在最顶层显示----弹出框效果