因为是模3,所以把原矩阵拆成两个01矩阵,然后按分配律拆开分别进行矩阵乘法,行列用bitset来存进行优化即可

注意

int bitset<int>::count() 函数可以统计bitset里有多少1

int bitset<int>::any() 函数可以统计bitset里是否有1 

/*
(A+B)*(C+D)=A*C+A*D+B*C+B*D
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 805
struct Matrix{
int n;
bitset<maxn>r[maxn];//按行表示
bitset<maxn>c[maxn];//按列表示
}A,B,C,D;
int E[maxn][maxn],F[maxn][maxn],G[maxn][maxn],H[maxn][maxn];
int n; void mul(Matrix A,Matrix B,int res[maxn][maxn]){
bitset<maxn>tmp;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
tmp=A.r[i]&B.c[j];
res[i][j]=tmp.count()%;
}
} int main(){
while(cin>>n){
A.n=B.n=C.n=D.n=n;
for(int i=;i<=n;i++){
A.c[i].reset();A.r[i].reset();
B.c[i].reset();B.r[i].reset();
C.c[i].reset();C.r[i].reset();
D.c[i].reset();D.r[i].reset();
} for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int x;
scanf("%d",&x);
x%=;
if(x>=){
A.r[i][j]=;
A.c[j][i]=;
}
if(x==){
B.r[i][j]=;
B.c[j][i]=;
}
} for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int x;
scanf("%d",&x);
x%=;
if(x>=){
C.r[i][j]=;
C.c[j][i]=;
}
if(x==){
D.r[i][j]=;
D.c[j][i]=;
}
}
mul(A,C,E);mul(A,D,F);
mul(B,C,G);mul(B,D,H); for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
int ans=E[i][j]+F[i][j]+G[i][j]+H[i][j];
if(j!=)
printf(" ");
printf("%d",ans%);
}
puts("");
}
}
}

矩阵乘法分配律+bitset优化——hdu4920的更多相关文章

  1. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)

    题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...

  2. 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

    挺好的数位dp……先说一下我个人的做法:经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所有数 ...

  3. codevs矩阵乘法系列

    T1:矩阵乘法板子题,练手. #include <map> #include <set> #include <cmath> #include <ctime&g ...

  4. Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)

    题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...

  5. hdu4920 Matrix multiplication 模3矩阵乘法

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

  6. CF781D Axel and Marston in Bitland [倍增 矩阵乘法 bitset]

    Axel and Marston in Bitland 好开心第一次补$F$题虽然是$Div.2$ 题意: 一个有向图,每条边是$0$或$1$,要求按如下规则构造一个序列然后走: 第一个是$0$,每次 ...

  7. CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs

    CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset https://www.luogu.org/problemnew/show/CF57 ...

  8. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

  9. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

随机推荐

  1. QList和QVector等容器的区别:(转)

    源地址:https://blog.csdn.net/qq_33266987/article/details/53333373 Qlist.QVector 与 list.vector似乎不太类似: li ...

  2. Web server failed to start. Port 8080 was already in use.

    Description: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the ...

  3. vue-resource请求

    man.js引入 import Vue from 'vue' import VueResource from 'vue-resource' import App from './App.vue' Vu ...

  4. 56. Map(双列集合)

    在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公  老婆(key-->value) 双列集合:-------------------| Map    如果是实现了Map接口的集合 ...

  5. java中文乱码转换

    String str=URLDecoder.decode(String, "UTF-8")

  6. java-逻辑处理

    类名是ItemDAO package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...

  7. [20190725NOIP模拟测试8]题解

    Orz T1 大水题,考场上看到题目中什么前几位相同末尾加字母莫名慌的一批 后来发现直接无脑哈希就能$O(n)$ KMP同样可切 仔细读题,数组别开小 #include<cstdio> # ...

  8. (转)Linux查看程序端口占用情况

    转:http://www.cnblogs.com/benio/archive/2010/09/15/1826728.html 今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. ...

  9. (转)OS: 生产者消费者问题(多进程+共享内存+信号量)

    转:http://blog.csdn.net/yaozhiyi/article/details/7561759 一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然 ...

  10. CF B. Planning The Expedition

    题意:有n个人和m个食物,给出每一个食物的种类,每个人只会吃一种食物,每个人一天吃一个食物,问这n个人可以撑多少天. 分析:因为题目给出的天数范围比较小所以我们可以从1到100天开始枚举,我们判断如果 ...