Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.99 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 < string > s(n);
  49. void solve(int n, int w) {
  50. int lim = (1 << lg[n]);
  51. if (lim == 2 || w == 1) {
  52. for (int i = 0; i < n; i++) {
  53. for (int j = 0; j < w; j++) {
  54. s[i] += bin[i][lg[n]];
  55. }
  56. }
  57. //printAns(s);
  58. return ;
  59. }
  60. if (lim == 4) {
  61. int k = w / 4;
  62. for (int i = 0; i < n; i++) {
  63. for (int j = 0; j < k; j++) {
  64. if (i == 0) {
  65. for (int t = 0; t < 3; t++) {
  66. s[i] += bin[0][lg[4]];
  67. }
  68. }
  69. else {
  70. for (int t = 0; t < 3; t++) {
  71. s[i] += bin[(i + t) % 3 + 1][lg[4]];
  72. }
  73. }
  74. }
  75. }
  76. int res = w % 4;
  77. for (int i = 0; i < n; i++) {
  78. for (int j = 0; j < res; j++) {
  79. s[i] += bin[i][lg[4]];
  80. }
  81. }
  82. //printAns(s);
  83. return ;
  84. }
  85. else {
  86. int c1 = -1;
  87. int c2 = -1;
  88. int c3 = -1;
  89. int k = lg[n];
  90. for (int i = 0; i * 3 <= k; i++) {
  91. if (c1 != -1) break;
  92. for (int j = 0; i * 3 + j * 4 <= k; j++) {
  93. if (c1 != -1) break;
  94. for (int t = 0; i * 3 + j * 4 + t * 5 <= k; t++) {
  95. if (i * 3 + j * 4 + t * 5 == k) {
  96. c1 = i;
  97. c2 = j;
  98. c3 = t;
  99. break;
  100. }
  101. }
  102. }
  103. }
  104. assert(c1 != -1);
  105. int f = w / 3;
  106. for (int i = 0; i < f; i++) {
  107. for (int j = 0; j < n; j++) {
  108. s[j] += bin[j][k];
  109. }
  110. for (int j = 0; j < n; j++) {
  111. int lm = 0;
  112. for (int t = 0; t < c1; t++) {
  113. int b8 = (j >> (lm)) % 8;
  114. lm += 3;
  115. s[j] += bin[f8[b8]][3];
  116. }
  117. for (int t = 0; t < c2; t++) {
  118. int b16 = (j >> (lm)) % 16;
  119. lm += 4;
  120. s[j] += bin[f16[b16]][4];
  121. }
  122. for (int t = 0; t < c3; t++) {
  123. int b32 = (j >> (lm)) % 32;
  124. lm += 5;
  125. s[j] += bin[f32[b32]][5];
  126. }
  127. }
  128. }
  129. for (int i = 0; i < w % 3; i++) {
  130. for (int j = 0; j < n; j++) {
  131. s[j] += bin[j][k];
  132. }
  133. }
  134. //printAns(s);
  135. return ;
  136. }
  137. //printAns(s);
  138. }
  139. int bits[maxN];
  140. mt19937 rnd(228);
  141. void go(int x) {
  142. vector < vector < int > > best;
  143. int a = -1;
  144. int b = 0;
  145. for (int len = 3; len <= 5; len++) {
  146. for (int steps = 0; steps < (int)1e6; steps++) {
  147. vector < int > p(x);
  148. for (int i = 0; i < x; i++) {
  149. p[i] = i;
  150. }
  151. vector<vector<int> > all;
  152. vector<vector<int> > dist(x, vector<int>(x, 0));
  153. for (int j = 0; j < len; j++) {
  154. shuffle(p.begin(), p.end(), rnd);
  155. all.push_back(p);
  156. for (int k = 0; k < x; k++) {
  157. for (int t = 0; t < x; t++) {
  158. dist[k][t] += bits[p[k] ^ p[t]];
  159. }
  160. }
  161. }
  162. int mn = 100000;
  163. for (int k = 0; k < x; k++) {
  164. for (int t = k + 1; t < x; t++) {
  165. mn = min(mn, dist[k][t]);
  166. }
  167. }
  168. if (mn * b > a * len) {
  169. a = mn;
  170. b = len;
  171. best = all;
  172. }
  173. }
  174. }
  175. cout << a << " " << b << " " << (1.0 * a / b) << endl;
  176. cout << "{";
  177. for (int i = 0; i < best.size(); i++) {
  178. if (i != 0) cout << "," << endl;
  179. cout << "{";
  180. for (int j = 0; j < best[i].size(); j++) {
  181. if (j != 0) {
  182. cout << ", ";
  183. }
  184. cout << best[i][j];
  185. }
  186. cout << "}" << endl;
  187. }
  188. cout << "}";
  189. /*do {
  190. random_shuffle(p.begin(), p.end());
  191. bool ok = true;
  192. int cnt = 1000;
  193. for (int i = 0; i < x; i++) {
  194. for (int j = i + 1; j < x; j++) {
  195. int f = bits[p[i] ^ p[j]] + bits[i ^ j];
  196. if (f == 2) {
  197. ok = false;
  198. break;
  199. }
  200. cnt = min(cnt, f);
  201. }
  202. }
  203. if (ok && cnt >= 4) {
  204. for (int i = 0; i < x; i++) {
  205. if (i != 0) cout << ", ";
  206. cout << p[i];
  207. }
  208. break;
  209. }
  210. } while (true);*/
  211. exit(0);
  212. }
  213. int main() {
  214. ios_base::sync_with_stdio(false);
  215. cin.tie(nullptr);
  216. srand(228);
  217. //freopen("input.txt", "r", stdin);
  218. for (int i = 1; i < maxN; i++) {
  219. bits[i] = bits[i / 2] + (i % 2);
  220. }
  221. go(32);
  222. lg[1] = 0;
  223. for (int i = 2; i < maxN; i++) {
  224. lg[i] = lg[(i + 1) / 2] + 1;
  225. }
  226. for (int i = 0; i < 12; i++) {
  227. for (int j = 0; j < (1 << i); j++) {
  228. for (int k = 0; k < i; k++) {
  229. bin[j][i] += ((j >> k) & 1) + '0';
  230. }
  231. }
  232. }
  233. int tst;
  234. cin >> tst;
  235. while (tst--) {
  236. cin >> n >> w >> m;
  237. w = 2 * w + 1;
  238. s.clear();
  239. s.resize(n, "");
  240. solve(n, w);
  241. printAns(s);
  242. }
  243. return 0;
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement