题意:
     给两个矩阵,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 巧用矩阵乘法结合律相关推荐

  1. ACM-ICPC 2018 江苏站 I. T-shirt (含矩阵乘法结合律证明)

    链接 https://nanti.jisuanke.com/t/28873 题目来源 The 2018 ACM-ICPC China JiangSu Provincial Programming Co ...

  2. 矩阵乘法结合律的证明(Proof of (AB)C = A(BC))

    记得有人说学高等数学的人遇到证明题通常会在心里感慨: 1. 这么难也能证明? 2. 这么明显也需要证明? 证明题虽然繁琐,费脑筋,但对于一门科学而言,是必不可少的. 今天来看看矩阵乘法结合律的证明过程 ...

  3. 矩阵乘法结合律的理解

    矩阵相似是同一个变换在不同基下的描述. 参考: https://spaces.ac.cn/archives/1777 这篇文章给出了关于矩阵相似的比较直观的理解, "矩阵是线性空间中的线性变 ...

  4. 矩阵快速幂的一份小结

    矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的 ...

  5. 每日黑巧携品牌全球代言人王一博发布新一代健康巧克力

    上海2021年9月14日 /美通社/ -- 众所周知,新消费赛道已经与热战场画上等号,在日新月异的市场脱颖而出,已然成为各大品牌的研究课题.争夺品牌升级的力量,永远藏在产品创新中. 2021年9月14 ...

  6. 首发:吴恩达的 CS229的数学基础(线性代数),有人把它做成了在线翻译版本!...

    本文是斯坦福大学 CS 229 机器学习课程的基础材料,是斯坦福各大人工智能课程的数学基础,本文为线性代数部分,原始文件下载[1] 原文作者:Zico Kolter,修改:Chuong Do, Ten ...

  7. CS229 机器学习课程复习材料-线性代数

    本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...

  8. 计算机图形学(三)-图形学中的基本变换(缩放、平移、旋转、剪切、镜像)

    图形学中的基本变换 1. 二维变换 1.1 缩放变换 1.2.镜像变换 1.3 剪切变换 1.4 旋转变换 1.5 平移变换 1.5.1 什么是线性变换 1.5.2 平移变换(仿射变换) 1.5.3 ...

  9. 机器学习的数学基础(一)

    三道试题 第一题 不是序 从15年开始真正接触机器学习,也尝试着看了一些书,比如<机器学习>(周志华).<统计机器学习>(李航).<机器学习实战>等等:一直对于相关 ...

最新文章

  1. devc++64位不兼容_DNF玩家遭强制脱坑,只因64位更新后无法上游戏,如何解决?...
  2. spring-boot-starter-parent 作用
  3. 第一阶段:Java基础之异常和处理
  4. JS 新建web sql 数据表
  5. 微软职位内部推荐-Software Development Engineer 2
  6. idea启动tomcat时蓝屏
  7. 源码--常用的人脸识别数据库
  8. 电脑屏保海底世界_电脑游戏假面骑士kiva中文版
  9. 记Python的一些用法
  10. 理解的三极管输出特性曲线图的放大区和饱和区,利用∆Ic小于∆βIb差值比较曲线左移右移关系
  11. try except Exception as e 检查异常
  12. MTCNN + Deep_Sort实现多目标人脸跟踪之MTCNN人脸检测部分(一)
  13. 数据库中关于preparedStatement和Statement分析
  14. 机器学习的几个重要问题
  15. Servlet中ServletConfig接口和ServletContext接口的作用
  16. 解决IDEA 打不开问题
  17. linux 汇编 preserve8,ARM汇编伪指令
  18. Xgboost近似分位数算法
  19. Win7共享无线 实现iPad 2 WiFi上网
  20. Arduino与Proteus仿真实例-密码门禁控制仿真

热门文章

  1. 1012: [JSOI2008]最大数maxnumber
  2. Hadoop权威指南阅读笔记
  3. 全面讲述linux集群负载均衡
  4. 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作
  5. 解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题...
  6. python---4
  7. Android 阻隔返回键
  8. CodeForces - 981G Magic multisets
  9. win bat 输入参数
  10. div在最顶层显示----弹出框效果