HDU 4920 Matrix multiplication 暴力(bitset)

来源:互联网 发布:minitab比较多组数据 编辑:程序博客网 时间:2024/05/16 02:31

点击打开链接

题意: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;}


0 0