題目描述
深度學習演算法很大程度上基於矩陣運算。例如神經網路中的全連線本質上是乙個矩陣乘法,而卷積運算也通常是用矩陣乘法來實現的。有一些科研工作者為了讓神經網路的計算更快捷,提出了二值化網路的方法,就是將網路權重壓縮成只用兩種值表示的形式,這樣就可以用一些 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 2 3樣例輸出3 48 a
f 56 7
0111
10
2提示
2≤n,m≤4096,1≤p≤64,0≤ai,j<65536,0≤bi,j≤1.
看起來是矩陣分塊,但是資料比較水,for for for暴力迴圈就能過題。
由於矩陣b是個01矩陣,所以如果按8位分塊,一塊最多有256種情況,預處理分塊後極限資料時間複雜度為5e8.
#include "bits/stdc++.h
"using
namespace
std;
const
int maxn = 4100
;int a[maxn][70], b[maxn][70
];int ap[maxn][10][260], bp[maxn][10
];int
main()
}for (int i = 0; i < m; i++)
}p = (p + 7) / 8
;
for (int i = 0; i < n; i++) }}
}}
for (int i = 0; i < m; i++) }}
int ans = 0
, temp;
for (int i = 0; i < n; i++)
ans ^=temp;}}
printf(
"%d\n
", ans);
return0;
}
posted @
2018-10-10 15:37
albert_liu 閱讀(
...)
編輯收藏
upc 9541 矩陣乘法 非正解
深度學習演算法很大程度上基於矩陣運算。例如神經網路中的全連線本質上是乙個矩陣乘法,而卷積運算也通常是用矩陣乘法來實現的。有一些科研工作者為了讓神經網路的計算更快捷,提出了二值化網路的方法,就是將網路權重壓縮成只用兩種值表示的形式,這樣就可以用一些 trick 加速計算了。例如兩個二進位制向量點乘,可...
暴力分塊矩陣乘法
樸素的演算法 o 4096 64 4096 o 1e9 不用想是超時的。因為每次矩陣乘法中存在很多重複的計算。考慮將矩陣進行分塊優化。預處理出每塊的值。怎麼分塊。考慮對a矩陣的列分塊,和b矩陣的行分塊。因為p是公共的邊,且p 64 需要注意到的是 b矩陣中的取值僅有01那麼如果對b矩陣進行分塊的話。...
BZOJ 2738 矩陣乘法 分塊
標算整體二分,然而窩太弱了並不會做。我們把n n個數排序,然後從小到大插入矩陣,每次插n個,用字首和維護每個子矩陣當前已經填了多少個數。查詢的時候 對於每個詢問,如果子矩陣裡的數已經超過了k個,說明答案在當前插入的這n個數里,倒著查詢即可。用鍊錶維護詢問,已經出解的直接跳過。因為每個詢問最多會查n次...