zoukankan      html  css  js  c++  java
  • 矩阵乘法分配律+bitset优化——hdu4920

    因为是模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=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                tmp=A.r[i]&B.c[j];
                res[i][j]=tmp.count()%3; 
            }
    }
    
    
    int main(){
        while(cin>>n){
            A.n=B.n=C.n=D.n=n;
            for(int i=1;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=1;i<=n;i++)
                for(int j=1;j<=n;j++){
                    int x;
                    scanf("%d",&x);
                    x%=3;
                    if(x>=1){
                        A.r[i][j]=1;
                        A.c[j][i]=1;
                    }
                    if(x==2){
                        B.r[i][j]=1;
                        B.c[j][i]=1;
                    }
                }
            
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++){
                    int x;
                    scanf("%d",&x);
                    x%=3;
                    if(x>=1){
                        C.r[i][j]=1;
                        C.c[j][i]=1;
                    }
                    if(x==2){
                        D.r[i][j]=1;
                        D.c[j][i]=1;
                    }
                }
            mul(A,C,E);mul(A,D,F);
            mul(B,C,G);mul(B,D,H);
            
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    int ans=E[i][j]+F[i][j]+G[i][j]+H[i][j];
                    if(j!=1)
                        printf(" ");
                    printf("%d",ans%3);
                }
                puts("");
            }    
        }
    }
  • 相关阅读:
    转:Jenkins自动化部署入门详细教程
    详解MySQL锁
    常见的内存溢出与解决办法
    read IEEE Standard for verilog(1)
    verilog之状态机
    quantus18的signaltap逻辑分析仪
    英语文档之关键词统计
    cadence软件画版图操作
    英语文档之vivado界面
    verilog之wire和reg
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11182183.html
Copyright © 2011-2022 走看看