1. 程式人生 > >【upc 9541 矩陣乘法】非正解

【upc 9541 矩陣乘法】非正解

深度學習演算法很大程度上基於矩陣運算。例如神經網路中的全連線本質上是一個矩陣乘法,而卷積運算也通常是用矩陣乘法來實現的。有一些科研工作者為了讓神經網路的計算更快捷,提出了二值化網路的方法,就是將網路權重壓縮成只用兩種值表示的形式,這樣就可以用一些 trick 加速計算了。例如兩個二進位制向量點乘,可以用計算機中的與運算代替,然後統計結果中 1 的個數即可。
然而有時候為了降低壓縮帶來的誤差,只允許其中一個矩陣被壓縮成二進位制。這樣的情況下矩陣乘法運算還能否做進一步優化呢?給定一個整數矩陣A 和一個二值矩陣B,計算矩陣乘法 C=A×B。為了減少輸出,你只需要計算 C 中所有元素的的異或和即可。
輸入

第一行有三個整數 N,P,M, 表示矩陣 A,B 的大小分別是 N×P,P×M 。
接下來 N 行是矩陣 A 的值,每一行有 P 個數字。第 i+1 行第 j 列的數字為 Ai,j, Ai,j 用大寫的16進製表示(即只包含 0~9, A~F),每個數字後面都有一個空格。
接下來 M 行是矩陣 B 的值,每一行是一個長為 P 的 01字串。第 i+N+1 行第 j 個字元表示 Bj,i 的值。
輸出
一個整數,矩陣 C 中所有元素的異或和。
樣例輸入:
4 3 2
3 4
8 A
F 5
6 7
01
11
10
樣例輸出
2
提示  2≤N,M≤4096,1≤P≤64,0≤Ai,j<65536,0≤Bi,j≤1.
暴力過的
 

#include <bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <cstdio>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll A[10000][100];
ll B[100][10000];
int n,p,m;
int main()
{
    scanf("%d%d%d",&n,&p,&m);
        for(int i=1;i<=n;++i)
           for(int j=1;j<=p;++j)
            {
                scanf("%x",&A[i][j]);
            }
            int t;
            for(int i=1;i<=m;++i)
            {
                for(int j=1;j<=p;++j)
                   {
                        scanf("%1d",&t);
                        B[j][i]=t;
                   }
            }
        ll ans=0;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
              {
                  ll ret=0;
                  for(int k=1;k<=p;++k)
                     ret+=A[i][k]*B[k][j];
                ans^=ret;
              }
        }
        printf("%lld\n",ans);
    return 0;
}

優化