题意:

     给你两个矩阵,让你求两矩阵的乘积,然后3取余。矩阵是n*n的,n<=800

思路:

       如果什么都不考虑的话,矩阵的乘法是o(n^3)的,800*800*800 = 512000000,超时那是妥妥的,而且还用到取余,%这个东西在我的印象里是很费时间的,回到这道题目,我们发现一个很关键的地方,就是%3,那么也就是说只有0.1.2这三种状态,这样的话我们直接改变一下矩阵乘法的循环顺序,然后每次跳过0,就可以节省1/3的时间了,然后就ac了,但是后来发现个很奇怪的地方就是如果不优化0,只要改变一下循环顺序也可以ac,

TLE

for(i = 1 ;i <= n ;i ++)

for(j = 1 ;j <= n ;j ++)

for(k = 1 ;k <= n ;k ++)

c[i][j] = c[i][j] + a[i][k] * b[k][j]

AC

for(k = 1 ;k <= n ;k ++)

for(i = 1 ;i <= n ;i ++)

for(j = 1 ;j <= n ;j ++)

c[i][j] = c[i][j] + a[i][k] * b[k][j]

或者

for(k = 1 ;k <= n ;k ++)

for(i = 1 ;i <= n ;i ++)

if(a[i][k])

for(j = 1 ;j <= n ;j ++)

c[i][j] = c[i][j] + a[i][k] * b[k][j]

上面第一种超时,第三种是优化了0,也就是优化掉了1/3的时间可以ac可以接受,但是接受不了的就是第二种为什么会ac,我后来查了写for循环的东西,知道了一点,

(1)

for(i = 1 ;i <= 10000 ;i ++)

for(j = 1 ;j <= 100 ;j ++)

(2)

for(i = 1 ;i <= 100 ;i ++)

for(j = 1 ;j <= 10000 ;j ++)

在算法的角度去考虑,上面两个的时间复杂度是一样的,但是在汇编角度去考虑,(2)会比(1)快很多,至于为什么,我不是很懂汇编,所以不能用汇编来解释,但是我猜测有可能是这样,第一层循环跳到第二层循环的时候有一些操作a,(1)比(2)多做了很多操作a,其余的地方他俩用的时间一样,这样就可能造成(2)比(1)快《结论是对的,证明是自己瞎猜的》,估计这个题目也是因为类似于这样的东西导致的第二种情况能ac<上面的这些都是我自己猜的,有了解的希望能给我留个言,我也学习学习>


#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>

typedef struct
{
int
mat[810][810];
}
A; A mat_mat(A a ,A b ,int n)
{

A 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];
}
return
c;
}

A a ,b ,c;
int main ()
{
int
n ,i ,j;
while(~
scanf("%d" ,&n))
{
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= n ;j ++)
{

scanf("%d" ,&a.mat[i][j]);
a.mat[i][j] %= 3;
}
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= n ;j ++)
{

scanf("%d" ,&b.mat[i][j]);
b.mat[i][j] %= 3;
}

c = mat_mat(a ,b ,n);
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= n ;j ++)
if(
j == n) printf("%d\n" ,c.mat[i][j] % 3);
else
printf("%d " ,c.mat[i][j] % 3);
}
return
0;
}

hdu4920 矩阵乘法%3的更多相关文章

  1. HDU4920 矩阵乘法

    嗯嗯 就算是水题吧. (缩完行就15行) 题意:两个n*n的矩阵相乘(n<=800),结果对3取模 思路:先对3取模,所以两个矩阵里面会出现很多0,所以可以先枚举一个矩阵,只有当该位置不是0的时 ...

  2. hdu4920 Matrix multiplication 模3矩阵乘法

    hdu4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  3. 矩阵乘法分配律+bitset优化——hdu4920

    因为是模3,所以把原矩阵拆成两个01矩阵,然后按分配律拆开分别进行矩阵乘法,行列用bitset来存进行优化即可 注意 int bitset<int>::count() 函数可以统计bits ...

  4. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  5. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  7. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  8. bzoj 2738 矩阵乘法

    其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...

  9. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

随机推荐

  1. HDOJ-2087(KMP算法)

    剪花布条 HDOJ-2087 本题和hdoj-1686相似,唯一不同的是这里的子串一定要是单独的.所以在确定有多少个子串时不能用前面的方法.而是在循环时,只要找到一个子串,i就不是++,而是+=子串的 ...

  2. [同步到 MaixPy3 文档] 使用 Python 编程入门开源硬件项目

    本文是给有一点 Python 基础但还想进一步深入的同学,有经验的开发者建议跳过. 前言 在写这篇案例系列的时候 junhuanchen 期望能够引导用户如何成为专业的开发者,不是只会调用代码就好,所 ...

  3. 再探命令行传参之c与python

    继上一次java命令行传参 python sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:python解释 ...

  4. RPC基础以及造一个RPC的轮子需要注意些什么

    RPC基础以及造一个RPC的轮子需要注意些什么 前言 rpc即远程过程调用,是分布式系统常用的通信方法.远程可以是在一台机器上的不同进程或在不同一个机器上的不同进程.rpc更看重速度,像调用本地方法一 ...

  5. Codeforces Round #533 C. Ayoub and Lost Array

    题面: 传送门 题目描述: 题意很简单:1.数组中的所有整数都在区间[l, r],2.所有元素之和能被3整除.现在知道这个数组的大小,l和r,问:按照题目的要求组成的数组一共有多少种可能.   题目分 ...

  6. 时间&空间(complexity)

    时间&空间复杂度 时间复杂度: 通俗来说就是随着数据量的增加,程序运行的时间花费量是怎么变化的,时间复杂度常用大o表示.举个例子,猜数字,猜10个,100个.1000个,猜数的数据量是在增加的 ...

  7. Go 中的 gRPC 入门详解

    目录 Go GRPC 入门 1,安装包 2,gRPC 服务端 3,gRPC 客户端 4,编译运行 5,其它 GRPC Protobuf buffer 字段类型 字段规则 Protobuf gRPC 四 ...

  8. 【RocketMQ源码分析】深入消息存储(3)

    前文回顾 CommitLog篇 --[RocketMQ源码分析]深入消息存储(1) ConsumeQueue篇 --[RocketMQ源码分析]深入消息存储(2) 前面两篇已经说过了消息如何存储到Co ...

  9. [模拟]P1047 校门外的树

    校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,- ...

  10. Java中注释的形式

    单行注释 单行注释 // #双斜杠 快捷键:Ctrl + / 多行注释 多行注释 /* */ #单斜杠星号 星号单斜杠 快捷键:Ctrl + shift + / 文档注释 多行注释 /** */ #单 ...