#pragma GCC optimize("O3,unroll-loops") #include #include #include #include #include using namespace std; int subG[9][9]; void init() { for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { int ix = i / 3, iy = i % 3; int jx = j / 3, jy = j % 3; subG[i][j] = ((ix - jx + 3) % 3) * 3 + ((iy - jy + 3) % 3); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); init(); vector a(9); iota(a.begin(), a.end(), 0); vector b(9); mt19937 rng(1337); while (true) { shuffle(a.begin(), a.end(), rng); iota(b.begin(), b.end(), 0); int a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8]; do { int mask = 0; bool ok = true; for (int y = 0; y < 9; ++y) { const int* row = subG[y]; int sum = a0 * b[row[0]] + a1 * b[row[1]] + a2 * b[row[2]] + a3 * b[row[3]] + a4 * b[row[4]] + a5 * b[row[5]] + a6 * b[row[6]] + a7 * b[row[7]] + a8 * b[row[8]]; sum %= 9; if (mask & (1 << sum)) { ok = false; break; } mask |= (1 << sum); } if (ok) { for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { int PA = i; int QA = (j % 3) * 3 + (j / 3); cout << a[subG[QA][PA]] << (j == 8 ? "" : " "); } cout << "\n"; } for (int j = 0; j < 9; ++j) { for (int k = 0; k < 9; ++k) { int PB = (j % 3) * 3 + (j / 3); int K = k / 3, m = k % 3; int QB = m * 3 + ((m + K) % 3); cout << b[subG[QB][PB]] << (k == 8 ? "" : " "); } cout << "\n"; } return 0; } } while (next_permutation(b.begin(), b.end())); } return 0; }