当前位置:   article > 正文

给定n,m(200),构造一个n*m的矩阵a,使得每个4*4的子矩阵,左上角2*2的子矩阵的异或和等于右下角的,左下角的异或和等于右上角的

给定n,m(200),构造一个n*m的矩阵a,使得每个4*4的子矩阵,左上角2*2的子矩阵的异或和等于右下角的,左下角的异或和等于右上角的

题目

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define pb push_back
  5. #define fi first
  6. #define se second
  7. #define lson p << 1
  8. #define rson p << 1 | 1
  9. const int maxn = 1e6 + 5, inf = 1e18 + 5, maxm = 4e4 + 5, mod = 998244353, N = 1e6;
  10. int a[505][505], b[maxn];
  11. // bool vis[maxn];
  12. int n, m;
  13. string s;
  14. int f[maxn];
  15. bool check(){
  16. for(int i = 1; i <= n; i++){
  17. for(int j = 1; j <= m; j++){
  18. if(i + 4 - 1 > n || j + 4 - 1 > m) continue;
  19. int t = a[i][j] ^ a[i][j + 1] ^ a[i + 1][j] ^ a[i + 1][j + 1];
  20. int t2 = a[i + 2][j + 2] ^ a[i + 2][j + 1 + 2] ^ a[i + 1 + 2][j + 2] ^ a[i + 1 + 2][j + 1 + 2];
  21. if(t != t2){
  22. cout << i << ' ' << j << '\n';
  23. cout << t << ' ' << t2 << '\n';
  24. return 0;
  25. }
  26. // cout << i << ' ' << j << ' ' << t << '\n';
  27. t = a[i][j + 2] ^ a[i][j + 1 + 2] ^ a[i + 1][j + 2] ^ a[i + 1][j + 1 + 2];
  28. t2 = a[i + 2][j] ^ a[i + 2][j + 1] ^ a[i + 1 + 2][j] ^ a[i + 1 + 2][j + 1];
  29. if((t != t2)){
  30. cout << i << ' ' << j << '\n';
  31. return 0;
  32. }
  33. }
  34. }
  35. return 1;
  36. }
  37. void ff(int x){
  38. for(int j = 15; j >= 0; j--){
  39. cout << (x >> j & 1);
  40. }
  41. cout << '\n';
  42. }
  43. void solve(){
  44. int res = 0;
  45. int k;
  46. int x;
  47. int q;
  48. cin >> n >> m;
  49. int add = 0;
  50. int d2 = 1LL << 30;
  51. for(int i = 1; i <= n; i += 2){
  52. add = 0;
  53. for(int j = 1; j <= m; j += 2){
  54. a[i][j] = 0 + add + (i - 1) / 2 * d2;
  55. a[i][j + 1] = 1 + add + (i - 1) / 2 * d2;
  56. a[i + 1][j] = 2 + add + (i - 1) / 2 * d2;
  57. a[i + 1][j + 1] = 3 + add + (i - 1) / 2 * d2;
  58. add += 4;
  59. }
  60. }
  61. /*
  62. 把 2 * 2 的子矩阵为一组,按
  63. 4*k, 4*k+1
  64. 4*k+2, 4*k+3 的方式构造,
  65. 每一组内异或和为0,但是为了矩阵的每个数字都不同,
  66. 每一行都要加上d2,第i行加(i - 1) / 2个d2
  67. */
  68. cout << n * m << '\n';
  69. for(int i = 1; i <= n; i++){
  70. for(int j = 1; j <= m; j++){
  71. cout << a[i][j] << ' ';
  72. }
  73. cout << '\n';
  74. }
  75. }
  76. signed main(){
  77. ios::sync_with_stdio(0);
  78. cin.tie(0);
  79. // fac[0] = 1;
  80. // for(int i = 1; i <= N; i++){
  81. // fac[i] = fac[i - 1] * i % mod;
  82. // }
  83. // inv[N] = qpow(fac[N], mod - 2);
  84. // for(int i = N - 1; i >= 0; i--){
  85. // inv[i] = inv[i + 1] * (i + 1) % mod;
  86. // }
  87. int T = 1;
  88. cin >> T;
  89. while (T--)
  90. {
  91. solve();
  92. }
  93. return 0;
  94. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/89336
推荐阅读
相关标签
  

闽ICP备14008679号