矩阵乘法 - 牛客

题解

分块,\(p\)拆成8个一组,因为\(B\)是二进制矩阵,所以8个一组的10进制值只有256种\((2^8)\),预处理以下就行了。\(A\)的大小压缩成了\((n, \frac{p - 1}{8} + 1)\),同理B的大小也压缩成了\((\frac{p - 1}{8} + 1, m)\),因为\(p \le 64\),所以分块后的矩阵乘法复杂度\(O(n * 8 * m)\)

代码

const int N = 4100;

int n, m, p;
int a[N][70], b[70][N], A[N][10][300], B[10][N];

int main()
{
    sc(n), sc(p), sc(m);

    rep(i, 0, n) rep(j, 0, p) scanf("%X", &a[i][j]);
    rep(i, 0, m) rep(j, 0, p) scanf("%1d", &b[j][i]);

    int sze = (p - 1) / 8 + 1;

    rep(i, 0, n) rep(j, 0, 256) {
        for (int k = 0, cnt = 0; k < p; k += 8, cnt++) {
            for (int t = 0; t < 8; ++t) if (j & (1 << t)) A[i][cnt][j] += a[i][k + t];
        }
    }

    rep(i, 0, m) {
        for (int k = 0, cnt = 0; k < p; k += 8, cnt++) {
            int res = 0;
            for (int t = 0; t < 8; ++t) if (b[k + t][i]) res += (1 << t);
            B[cnt][i] = res;
        }
    }

    int ans = 0;
    rep(i, 0, n) {
        rep(j, 0, m) {
            int res = 0;
            rep(k, 0, sze) res += A[i][k][B[k][j]];
            ans ^= res;
        }
    }
    pr(ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zgglj-com/p/9770063.html