Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- int n, w, m;
- bool LOCAL = false;
- void check(vector < string >& s) {
- assert(s.size() == n);
- for (int i = 0; i < n; i++) {
- for (int j = i + 1; j < n; j++) {
- int cnt = 0;
- assert(s[i].size() == s[j].size());
- for (int k = 0; k < s[i].size(); k++) {
- cnt += (s[i][k] != s[j][k]);
- }
- assert(cnt >= w);
- }
- }
- }
- void printAns(vector < string >& s) {
- if (LOCAL) {
- check(s);
- }
- cout << s[0].size() << '\n';
- for (int i = 0; i < s[0].size(); i++) {
- for (int j = 0; j < s.size(); j++) {
- cout << s[j][i];
- }
- cout << '\n';
- }
- }
- const int maxN = (1 << 12) + 20;
- string bin[maxN][15];
- int lg[maxN];
- vector < int > f8 = {3, 4, 6, 1, 0, 7, 5, 2};
- vector < int > f16 = {1, 6, 10, 15, 14, 11, 9, 5, 13, 3, 0, 12, 4, 8, 7, 2};
- vector < int > f32 = {4, 22, 28, 1, 8, 17, 18, 14, 21, 7, 2, 25, 26, 31, 5, 11, 3, 0, 10, 30, 20, 6, 13, 23, 15, 19, 27, 16, 9, 12, 24, 29};
- vector < vector < int > > gg8 = {{1, 7, 4, 5, 6, 0, 3, 2}
- ,
- {7, 4, 5, 2, 3, 1, 0, 6}
- ,
- {6, 4, 3, 7, 1, 0, 5, 2}
- ,
- {4, 2, 5, 0, 6, 1, 7, 3}
- ,
- {4, 5, 7, 3, 1, 0, 2, 6}
- };
- vector < string > s(n);
- void solve(int n, int w) {
- int lim = (1 << lg[n]);
- if (lim == 2 || w == 1) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < w; j++) {
- s[i] += bin[i][lg[n]];
- }
- }
- //printAns(s);
- return ;
- }
- if (lim == 4) {
- int k = w / 4;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < k; j++) {
- if (i == 0) {
- for (int t = 0; t < 3; t++) {
- s[i] += bin[0][lg[4]];
- }
- }
- else {
- for (int t = 0; t < 3; t++) {
- s[i] += bin[(i + t) % 3 + 1][lg[4]];
- }
- }
- }
- }
- int res = w % 4;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < res; j++) {
- s[i] += bin[i][lg[4]];
- }
- }
- //printAns(s);
- return ;
- }
- else {
- int c1 = -1;
- int c2 = -1;
- int c3 = -1;
- int k = lg[n];
- for (int i = 0; i * 3 <= k; i++) {
- if (c1 != -1) break;
- for (int j = 0; i * 3 + j * 4 <= k; j++) {
- if (c1 != -1) break;
- for (int t = 0; i * 3 + j * 4 + t * 5 <= k; t++) {
- if (i * 3 + j * 4 + t * 5 == k) {
- c1 = i;
- c2 = j;
- c3 = t;
- break;
- }
- }
- }
- }
- assert(c1 != -1);
- int f = w / 3;
- for (int i = 0; i < f; i++) {
- for (int j = 0; j < n; j++) {
- s[j] += bin[j][k];
- }
- for (int j = 0; j < n; j++) {
- int lm = 0;
- for (int t = 0; t < c1; t++) {
- int b8 = (j >> (lm)) % 8;
- lm += 3;
- s[j] += bin[f8[b8]][3];
- }
- for (int t = 0; t < c2; t++) {
- int b16 = (j >> (lm)) % 16;
- lm += 4;
- s[j] += bin[f16[b16]][4];
- }
- for (int t = 0; t < c3; t++) {
- int b32 = (j >> (lm)) % 32;
- lm += 5;
- s[j] += bin[f32[b32]][5];
- }
- }
- }
- for (int i = 0; i < w % 3; i++) {
- for (int j = 0; j < n; j++) {
- s[j] += bin[j][k];
- }
- }
- //printAns(s);
- return ;
- }
- //printAns(s);
- }
- int bits[maxN];
- mt19937 rnd(228);
- void go(int x) {
- vector < vector < int > > best;
- int a = -1;
- int b = 0;
- for (int len = 3; len <= 5; len++) {
- for (int steps = 0; steps < (int)1e6; steps++) {
- vector < int > p(x);
- for (int i = 0; i < x; i++) {
- p[i] = i;
- }
- vector<vector<int> > all;
- vector<vector<int> > dist(x, vector<int>(x, 0));
- for (int j = 0; j < len; j++) {
- shuffle(p.begin(), p.end(), rnd);
- all.push_back(p);
- for (int k = 0; k < x; k++) {
- for (int t = 0; t < x; t++) {
- dist[k][t] += bits[p[k] ^ p[t]];
- }
- }
- }
- int mn = 100000;
- for (int k = 0; k < x; k++) {
- for (int t = k + 1; t < x; t++) {
- mn = min(mn, dist[k][t]);
- }
- }
- if (mn * b > a * len) {
- a = mn;
- b = len;
- best = all;
- }
- }
- }
- cout << a << " " << b << " " << (1.0 * a / b) << endl;
- cout << "{";
- for (int i = 0; i < best.size(); i++) {
- if (i != 0) cout << "," << endl;
- cout << "{";
- for (int j = 0; j < best[i].size(); j++) {
- if (j != 0) {
- cout << ", ";
- }
- cout << best[i][j];
- }
- cout << "}" << endl;
- }
- cout << "}";
- /*do {
- random_shuffle(p.begin(), p.end());
- bool ok = true;
- int cnt = 1000;
- for (int i = 0; i < x; i++) {
- for (int j = i + 1; j < x; j++) {
- int f = bits[p[i] ^ p[j]] + bits[i ^ j];
- if (f == 2) {
- ok = false;
- break;
- }
- cnt = min(cnt, f);
- }
- }
- if (ok && cnt >= 4) {
- for (int i = 0; i < x; i++) {
- if (i != 0) cout << ", ";
- cout << p[i];
- }
- break;
- }
- } while (true);*/
- exit(0);
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- srand(228);
- //freopen("input.txt", "r", stdin);
- for (int i = 1; i < maxN; i++) {
- bits[i] = bits[i / 2] + (i % 2);
- }
- go(32);
- lg[1] = 0;
- for (int i = 2; i < maxN; i++) {
- lg[i] = lg[(i + 1) / 2] + 1;
- }
- for (int i = 0; i < 12; i++) {
- for (int j = 0; j < (1 << i); j++) {
- for (int k = 0; k < i; k++) {
- bin[j][i] += ((j >> k) & 1) + '0';
- }
- }
- }
- int tst;
- cin >> tst;
- while (tst--) {
- cin >> n >> w >> m;
- w = 2 * w + 1;
- s.clear();
- s.resize(n, "");
- solve(n, w);
- printAns(s);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement