1 条题解
-
1
#include <bits/stdc++.h> typedef unsigned long long u64; const int P = 1e9 + 7; char rb[6000000], *rp = rb, ob[3000000], *op = ob; int rd() { int x = 0, f = 1; while (*rp < 48) *rp++ == '-' ? f = -1 : 0; while (*rp > 47) x = x * 10 + *rp++ -48; return x * f; } void pr(int x) { int ss[15], sp = 0; do ss[++sp] = x % 10, x /= 10; while (x); while (sp) *op++ = ss[sp--] + 48; } int n, p, m; int a[507][507], b[507][507]; u64 c[507]; int fix(int x) { return x + (x >> 31 & P); } int main() { fread(rb, 1, sizeof(rb), stdin); n = rd(), p = rd(), m = rd(); for (int i = 1; i <= n; ++i) for (int j = 1; j <= p; ++j) a[i][j] = fix(rd()); for (int i = 1; i <= p; ++i) for (int j = 1; j <= m; ++j) b[i][j] = fix(rd()); int m1 = m - m % 8; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) c[j] = 0; for (int k = 1; k <= p; ++k) { int *y = b[k]; u64 x = a[i][k], *z = c; for (int j = 8; j <= m1; j += 8) { z[1] += x * y[1]; z[2] += x * y[2]; z[3] += x * y[3]; z[4] += x * y[4]; z[5] += x * y[5]; z[6] += x * y[6]; z[7] += x * y[7]; z[8] += x * y[8]; z += 8, y += 8; } y = b[k]; for (int j = m1 + 1; j <= m; ++j) c[j] += x * y[j]; if (!(k & 15)) for (int j = 1; j <= m; ++j) c[j] -= (c[j] >> 30) * P; } for (int j = 1; j <= m; ++j) pr(c[j] % P), *op++ = 32; *op++ = 10; } fwrite(ob, 1, op - ob, stdout); return 0; }
- 1
信息
- ID
- 5531
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者