for (int i = 0; i < n; i++) for (int j = 0; j < d; j++) scanf("%d", &Q[i][j]); for (int i = 0; i < n; i++) for (int j = 0; j < d; j++) scanf("%d", &K[i][j]); for (int i = 0; i < n; i++) for (int j = 0; j < d; j++) scanf("%d", &V[i][j]); for (int i = 0; i < n; i++) scanf("%d", &W[i]);
// Q = W · Q for (int i = 0; i < n; i++) for (int j = 0; j < d; j++) Q[i][j] *= W[i];
// KT × V for (int i = 0; i < d; i++) for (int j = 0; j < d; j++) for (int k = 0; k < n; k++) tmp_small[i][j] += K[k][i] * V[k][j];
// Q × (KT × V) for (int i = 0; i < n; i++) for (int j = 0; j < d; j++) for (int k = 0; k < d; k++) res[i][j] += Q[i][k] * tmp_small[k][j];
// 输出结果 for (int i = 0; i < n; i++) for (int j = 0; j < d; j++) printf("%lld%c", res[i][j], j == d - 1 ? '\n' : ' '); }
此处因为 n 和 d 都是在输入之后才知道的量,因此使用 vector 进行数据的存储。vector<vector<int>> Q(n, vector<int>(d)); 是 vector 初始化的一种方式,表示创建了一个大小为 n 的 vector,其中每个元素都是一个大小为 d 的 vector<int>。
intread_boot_domain(int &length) { char char1, char2; int base = 1, num_byte = 0; // base为基,num_byte为现在已经读取的字节数 while (true) // 读取引导区 { get_byte(char1, char2); int num = byte_to_int(char1, char2); if (num < 128) { length += num * base; break; } length += (num - 128) * base; base *= 128; num_byte += 1; } return num_byte + 1; // 在break的地方还要加1 }
intread_literal(int type) { int l = 0, extend_type = 0; // l是字面量的长度,extend_type是表示后面有几个字节用来存储字面量长度 char c1, c2; // 获得字面量长度 if (type / 4 <= 59) l = type / 4 + 1; else { extend_type = type / 4 - 59; int base = 1; for (int i = 0; i < extend_type; i++) { get_byte(c1, c2); l += byte_to_int(c1, c2) * base; base *= 256; } l += 1; } // 读取字面量 for (int i = 0; i < l; i++) { get_byte(c1, c2); print_byte(c1, c2); } return l + extend_type + 1; // 返回的数表示这个元素占用的字节数 }
voidread_trace_helper(int o, int l) { int start_point = num_unzip - o; if (o >= l) for (int i = 0; i < l; i++) print_byte(unzip_data[(start_point + i) * 2], unzip_data[(start_point + i) * 2 + 1]); else for (int i = 0; i < l; i++) print_byte(unzip_data[(start_point + i % o) * 2], unzip_data[(start_point + i % o) * 2 + 1]); }
intread_trace1(int type) { char c1, c2; int l = (type / 4) % 8 + 4; int o = type / 32; get_byte(c1, c2); o = o * 256 + byte_to_int(c1, c2); read_trace_helper(o, l); return2; // 返回的数表示这个元素占用的字节数 }
intread_trace2(int type) { char c1, c2; int l = type / 4 + 1; get_byte(c1, c2); int o = byte_to_int(c1, c2); get_byte(c1, c2); o = o + byte_to_int(c1, c2) * 256; read_trace_helper(o, l); return3; // 返回的数表示这个元素占用的字节数 }