Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. int n, w, m;
  6. bool LOCAL = false;
  7. void check(vector < string >& s) {
  8. assert(s.size() == n);
  9. for (int i = 0; i < n; i++) {
  10. for (int j = i + 1; j < n; j++) {
  11. int cnt = 0;
  12. assert(s[i].size() == s[j].size());
  13. for (int k = 0; k < s[i].size(); k++) {
  14. cnt += (s[i][k] != s[j][k]);
  15. }
  16. assert(cnt >= w);
  17. }
  18. }
  19. }
  20. void printAns(vector < string >& s) {
  21. if (LOCAL) {
  22. check(s);
  23. }
  24. cout << s[0].size() << '\n';
  25. for (int i = 0; i < s[0].size(); i++) {
  26. for (int j = 0; j < s.size(); j++) {
  27. cout << s[j][i];
  28. }
  29. cout << '\n';
  30. }
  31. }
  32. const int maxN = (1 << 12) + 20;
  33. string bin[maxN][15];
  34. int lg[maxN];
  35. vector < int > f8 = {3, 4, 6, 1, 0, 7, 5, 2};
  36. vector < int > f16 = {1, 6, 10, 15, 14, 11, 9, 5, 13, 3, 0, 12, 4, 8, 7, 2};
  37. 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};
  38. vector < vector < int > > gg8 = {{1, 7, 4, 5, 6, 0, 3, 2}
  39. ,
  40. {7, 4, 5, 2, 3, 1, 0, 6}
  41. ,
  42. {6, 4, 3, 7, 1, 0, 5, 2}
  43. ,
  44. {4, 2, 5, 0, 6, 1, 7, 3}
  45. ,
  46. {4, 5, 7, 3, 1, 0, 2, 6}
  47. };
  48. vector < vector < int > > gg16 = {{9, 10, 8, 11, 12, 1, 15, 4, 0, 2, 6, 7, 3, 5, 13, 14}
  49. ,
  50. {13, 15, 8, 1, 4, 0, 6, 2, 12, 11, 9, 14, 5, 10, 7, 3}
  51. ,
  52. {9, 14, 3, 12, 7, 15, 1, 8, 11, 2, 5, 4, 6, 13, 10, 0}
  53. ,
  54. {4, 1, 5, 10, 0, 12, 13, 2, 8, 15, 9, 6, 14, 7, 11, 3}
  55. ,
  56. {9, 5, 15, 12, 1, 10, 14, 3, 4, 11, 6, 0, 7, 13, 2, 8}
  57. };
  58. vector < vector < int > > gg32 = {{7, 18, 27, 13, 17, 16, 14, 20, 25, 10, 30, 2, 31, 23, 0, 5, 28, 11, 29, 1, 8, 9, 3, 26, 4, 22, 21, 6, 15, 12, 24, 19}
  59. ,
  60. {21, 30, 25, 1, 11, 12, 20, 22, 5, 13, 0, 6, 26, 10, 28, 14, 23, 27, 19, 9, 15, 24, 17, 3, 31, 18, 4, 2, 8, 29, 16, 7}
  61. ,
  62. {5, 4, 6, 31, 23, 7, 16, 13, 12, 20, 11, 24, 26, 29, 14, 3, 1, 27, 15, 17, 9, 25, 0, 22, 18, 21, 8, 28, 30, 10, 2, 19}
  63. ,
  64. {20, 15, 11, 30, 18, 9, 2, 12, 29, 31, 23, 16, 21, 26, 7, 27, 25, 14, 24, 4, 28, 3, 10, 19, 8, 1, 22, 6, 13, 17, 0, 5}
  65. ,
  66. {20, 0, 9, 25, 16, 13, 17, 3, 28, 18, 10, 2, 30, 23, 24, 11, 31, 22, 1, 14, 26, 27, 19, 29, 4, 21, 5, 8, 12, 7, 15, 6}
  67. };
  68. vector < string > s(n);
  69. void solve(int n, int w) {
  70. int lim = (1 << lg[n]);
  71. if (lim == 2 || w == 1) {
  72. for (int i = 0; i < n; i++) {
  73. for (int j = 0; j < w; j++) {
  74. s[i] += bin[i][lg[n]];
  75. }
  76. }
  77. //printAns(s);
  78. return ;
  79. }
  80. if (lim == 4) {
  81. int k = w / 4;
  82. for (int i = 0; i < n; i++) {
  83. for (int j = 0; j < k; j++) {
  84. if (i == 0) {
  85. for (int t = 0; t < 3; t++) {
  86. s[i] += bin[0][lg[4]];
  87. }
  88. }
  89. else {
  90. for (int t = 0; t < 3; t++) {
  91. s[i] += bin[(i + t) % 3 + 1][lg[4]];
  92. }
  93. }
  94. }
  95. }
  96. int res = w % 4;
  97. for (int i = 0; i < n; i++) {
  98. for (int j = 0; j < res; j++) {
  99. s[i] += bin[i][lg[4]];
  100. }
  101. }
  102. //printAns(s);
  103. return ;
  104. }
  105. else {
  106. int c1 = -1;
  107. int c2 = -1;
  108. int c3 = -1;
  109. int k = lg[n];
  110. for (int i = 0; i * 3 <= k; i++) {
  111. if (c1 != -1) break;
  112. for (int j = 0; i * 3 + j * 4 <= k; j++) {
  113. if (c1 != -1) break;
  114. for (int t = 0; i * 3 + j * 4 + t * 5 <= k; t++) {
  115. if (i * 3 + j * 4 + t * 5 == k) {
  116. c1 = i;
  117. c2 = j;
  118. c3 = t;
  119. break;
  120. }
  121. }
  122. }
  123. }
  124. assert(c1 != -1);
  125. if (w >= 8 || w == 11) {
  126. for (int kk = 0; kk < 5; kk++) {
  127. for (int j = 0; j < n; j++) {
  128. int lm = 0;
  129. for (int t = 0; t < c1; t++) {
  130. int b8 = (j >> (lm)) % 8;
  131. lm += 3;
  132. s[j] += bin[gg8[kk][b8]][3];
  133. }
  134. for (int t = 0; t < c2; t++) {
  135. int b16 = (j >> (lm)) % 16;
  136. lm += 4;
  137. s[j] += bin[gg16[kk][b16]][4];
  138. }
  139. for (int t = 0; t < c3; t++) {
  140. int b32 = (j >> (lm)) % 32;
  141. lm += 5;
  142. s[j] += bin[gg32[kk][b32]][5];
  143. }
  144. }
  145. }
  146. solve(n, w - 8);
  147. return ;
  148. }
  149. int f = w / 3;
  150. for (int i = 0; i < f; i++) {
  151. for (int j = 0; j < n; j++) {
  152. s[j] += bin[j][k];
  153. }
  154. for (int j = 0; j < n; j++) {
  155. int lm = 0;
  156. for (int t = 0; t < c1; t++) {
  157. int b8 = (j >> (lm)) % 8;
  158. lm += 3;
  159. s[j] += bin[f8[b8]][3];
  160. }
  161. for (int t = 0; t < c2; t++) {
  162. int b16 = (j >> (lm)) % 16;
  163. lm += 4;
  164. s[j] += bin[f16[b16]][4];
  165. }
  166. for (int t = 0; t < c3; t++) {
  167. int b32 = (j >> (lm)) % 32;
  168. lm += 5;
  169. s[j] += bin[f32[b32]][5];
  170. }
  171. }
  172. }
  173. for (int i = 0; i < w % 3; i++) {
  174. for (int j = 0; j < n; j++) {
  175. s[j] += bin[j][k];
  176. }
  177. }
  178. //printAns(s);
  179. return ;
  180. }
  181. //printAns(s);
  182. }
  183. int bits[maxN];
  184. mt19937 rnd(228);
  185. void go(int x) {
  186. vector < vector < int > > best;
  187. int a = -1;
  188. int b = 0;
  189. for (int len = 3; len <= 7; len++) {
  190. for (int steps = 0; steps < (int)1e6; steps++) {
  191. vector < int > p(x);
  192. for (int i = 0; i < x; i++) {
  193. p[i] = i;
  194. }
  195. vector<vector<int> > all;
  196. vector<vector<int> > dist(x, vector<int>(x, 0));
  197. for (int j = 0; j < len; j++) {
  198. shuffle(p.begin(), p.end(), rnd);
  199. all.push_back(p);
  200. for (int k = 0; k < x; k++) {
  201. for (int t = 0; t < x; t++) {
  202. dist[k][t] += bits[p[k] ^ p[t]];
  203. }
  204. }
  205. }
  206. int mn = 100000;
  207. for (int k = 0; k < x; k++) {
  208. for (int t = k + 1; t < x; t++) {
  209. mn = min(mn, dist[k][t]);
  210. }
  211. }
  212. if (mn * b > a * len) {
  213. a = mn;
  214. b = len;
  215. best = all;
  216. }
  217. }
  218. }
  219. cout << a << " " << b << " " << (1.0 * a / b) << endl;
  220. cout << "{";
  221. for (int i = 0; i < best.size(); i++) {
  222. if (i != 0) cout << "," << endl;
  223. cout << "{";
  224. for (int j = 0; j < best[i].size(); j++) {
  225. if (j != 0) {
  226. cout << ", ";
  227. }
  228. cout << best[i][j];
  229. }
  230. cout << "}" << endl;
  231. }
  232. cout << "}";
  233. /*do {
  234. random_shuffle(p.begin(), p.end());
  235. bool ok = true;
  236. int cnt = 1000;
  237. for (int i = 0; i < x; i++) {
  238. for (int j = i + 1; j < x; j++) {
  239. int f = bits[p[i] ^ p[j]] + bits[i ^ j];
  240. if (f == 2) {
  241. ok = false;
  242. break;
  243. }
  244. cnt = min(cnt, f);
  245. }
  246. }
  247. if (ok && cnt >= 4) {
  248. for (int i = 0; i < x; i++) {
  249. if (i != 0) cout << ", ";
  250. cout << p[i];
  251. }
  252. break;
  253. }
  254. } while (true);*/
  255. exit(0);
  256. }
  257. int main() {
  258. ios_base::sync_with_stdio(false);
  259. cin.tie(nullptr);
  260. srand(228);
  261. //freopen("input.txt", "r", stdin);
  262. for (int i = 1; i < maxN; i++) {
  263. bits[i] = bits[i / 2] + (i % 2);
  264. }
  265. go(64);
  266. lg[1] = 0;
  267. for (int i = 2; i < maxN; i++) {
  268. lg[i] = lg[(i + 1) / 2] + 1;
  269. }
  270. for (int i = 0; i < 12; i++) {
  271. for (int j = 0; j < (1 << i); j++) {
  272. for (int k = 0; k < i; k++) {
  273. bin[j][i] += ((j >> k) & 1) + '0';
  274. }
  275. }
  276. }
  277. int tst;
  278. cin >> tst;
  279. while (tst--) {
  280. cin >> n >> w >> m;
  281. w = 2 * w + 1;
  282. s.clear();
  283. s.resize(n, "");
  284. solve(n, w);
  285. printAns(s);
  286. }
  287. return 0;
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement