upc 9541 矩陣乘法 (矩陣分塊)

2021-09-24 10:48:28 字數 1480 閱讀 6180

題目描述

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