题意:n*n矩阵A,B相乘后%3的结果 n<=800
直接相乘,O(n^3)=5e8 TLE
由于求%3后的结果 则用bitset保存A每行和B每列%3后的情况
则c[i][j]=A第i行和B第j列,共有部分的个数*权值x(x=1,2,4)
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+20;
bitset<N> a[N][3],b[N][3];
int ans(int i,int j)
{
//& 第i行和第j列都有的部分
int x=(a[i][1]&b[j][1]).count();
int y=(a[i][1]&b[j][2]).count();
int z=(a[i][2]&b[j][1]).count();
int l=(a[i][2]&b[j][2]).count();
return x+y*2+z*2+l*4;
}
int main()
{
int n;
while(cin>>n)
{
int x;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
a[i][j].reset(),b[i][j].reset();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
a[i][x%3].set(j);//i行第j列值为x%3值置为1
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
b[j][x%3].set(i);//
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
printf("%d%c",ans(i,j)%3,j==n?'\n':' ');
}
return 0;
}