【upc 9541 矩陣乘法】非正解
阿新 • • 發佈:2018-11-30
深度學習演算法很大程度上基於矩陣運算。例如神經網路中的全連線本質上是一個矩陣乘法,而卷積運算也通常是用矩陣乘法來實現的。有一些科研工作者為了讓神經網路的計算更快捷,提出了二值化網路的方法,就是將網路權重壓縮成只用兩種值表示的形式,這樣就可以用一些 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; }