#include <bits/stdc++.h>
const int n = 512, N = n;
void multiply (int c[N][N], int a[N][N], int b[N][N]) {
for(int i = 0; i < n; i ++)
for(int l = 0; l < n; l ++)
for(int j = 0; j < n; j ++)
c[i][j] += (a[i][l] * b[l][j]);
}
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);
}
}
这份代码远比下面的代码快,可它们只是交换了循环顺序,都是 O(n3) 的,这是为什么?
#include <bits/stdc++.h>
const int n = 512, N = n;
void multiply (int c[N][N], int a[N][N], int b[N][N]) {
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
for(int l = 0; l < n; l ++)
c[i][j] += (a[i][l] * b[l][j]);
}
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);
}
}