#B3615. 测测你的矩阵乘法

测测你的矩阵乘法

题目描述

给定两个大小为均为 512×512512 \times 512,每个元素均为整数,值域为 [0,1024) [0, 1024) 矩阵 A,BA, B,定义为

A[i,j]=((iorj)+j)xorseedAB[i,j]=((iandj)+i)xorseedB \begin{aligned} A\left[i, j\right] &= \left(\left(i \mathbin{\mathrm{or}} j\right) + j\right) \mathbin{\mathrm{xor}} \mathrm{seed}_A \\ B\left[i, j \right] &= \left( \left(i \mathbin{\mathrm{and}} j \right) + i \right) \mathbin{\mathrm{xor}} \mathrm{seed}_B \end{aligned}

其中 i,j[0,512)i, j \in [0, 512)

请计算 C=A×BC = A \times B

输入格式

输入为两个整数 seedA,seedB\mathrm{seed}_A, \mathrm{seed}_B0seedA,seedB<10240 \leq \mathrm{seed}_A, \mathrm{seed}_B < 1024)。

你可以使用以下代码模板,完成其中的 multiply 即可。

你可以修改 NN(即数组长度),但是不能修改 nn(矩阵大小,恒为 512512)。

#include <bits/stdc++.h>
const int n = 512, N = n;
void multiply (int c[N][N], int a[N][N], int b[N][N]) {
	// c = a * b
}
int c[N][N], a[N][N], b[N][N];
int main() {
	int seedA, seedB;
	scanf("%d%d", &seedA, &seedB);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = ((i | j) + j) ^ seedA;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            b[i][j] = ((i & j) + i) ^ seedB;
    multiply(c, a, b);
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j < n; j++) sum ^= c[i][j];
        printf("%d\n", sum);
    }
}

输出格式

输出 512512 行,分别是 CC 每行的异或和。

输入中的代码会帮助你完成输出。

0 0
8126464
14942208
33554432
...(省略506行)
29097984
146800640
148570112