求矩阵A和B相乘的结果。
因为答案只要对3取模,所以我们可以通过一些方法来加速计算。
我们对两个矩阵各开两个bitset,分别存储模3余1和模3余2的数。
然后相乘的时候and一下就好了。
c[i][j] = f(a_one[i] & b_one[j]) + f(a_one[i] & b_two[j]) * 2 + f(a_two[i] & b_one[j]) * 2 + f(a_two[i] & b_two[j])
$f(x)$表示 x中1的个数
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int A = 810;
const int mod = 3; int n;
bitset <A> a_one[A], a_two[A], b_one[A], b_two[A], tmp;
int x; int main(){ while (~scanf("%d", &n)){ rep(i, 1, n){
a_one[i].reset();
a_two[i].reset();
b_one[i].reset();
b_two[i].reset();
} rep(i, 1, n){
rep(j, 1, n){
scanf("%d", &x);
x %= 3;
if (x == 1) a_one[i].set(j);
else if (x == 2) a_two[i].set(j);
}
} rep(i, 1, n){
rep(j, 1, n){
scanf("%d", &x);
x %= 3;
if (x == 1) b_one[j].set(i);
else if (x == 2) b_two[j].set(i);
}
} rep(i, 1, n){
rep(j, 1, n){
int ans = 0;
tmp = a_one[i] & b_one[j];
ans += tmp.count();
tmp = a_one[i] & b_two[j];
ans += 2 * tmp.count();
tmp = a_two[i] & b_one[j];
ans += 2 * tmp.count();
tmp = a_two[i] & b_two[j];
ans += tmp.count();
ans %= 3;
printf("%d", ans);
if (j < n) putchar(32);
}
putchar(10);
} } return 0;
}