a53

xor1

a53
Jun 21st, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. #include <fstream>
  2. #define SOL 1
  3. #define BRUT 0
  4. #define OPTIM 1
  5. #define SUB_OPTIM 3
  6. #define COMB 2
  7. #define SUB_COMB 4
  8. #define C(u,v) (((u)&(v))==0)
  9.  
  10.  
  11. using namespace std;
  12. ifstream f("xor1.in");
  13. ofstream g("xor1.out");
  14. void brut();
  15. void optim();
  16. void comb();
  17. void sub_optim_log();
  18. void sub_comb_log();
  19. int n,m,i,j,k,q,b,sol,A,B,mod,aux,x[1020][1020],Clog(int,int);
  20. int main()
  21. {
  22. if(SOL==BRUT)brut();
  23. if(SOL==SUB_OPTIM)sub_optim_log();
  24. if(SOL==OPTIM)optim();
  25. if(SOL==SUB_COMB)sub_comb_log();
  26. if(SOL==COMB)comb();
  27. return 0;
  28. }
  29. void brut()
  30. {
  31. f>>q>>n>>m>>A>>B>>mod;
  32. for(j=1;j<mod;j++)
  33. x[0][j]=j;
  34. for(i=1;i<mod;i++)
  35. for(j=1;j<mod;j++)
  36. x[i][j]=x[i-1][j]^x[i][j-1];
  37. for(;q;q--)
  38. {
  39. g<<x[n][m]<<'\n';
  40. m=(1LL*A*m+B)%mod;
  41. n=(1LL*A*n+B)%mod;
  42. }
  43. }
  44. void optim()
  45. {
  46. f>>q>>n>>m>>A>>B>>mod;
  47. for(;q;q--)
  48. {
  49. for(b=1,sol=0;b<=(1<<30)&&m>=b;b<<=1)
  50. if(C(m-b,n+b))
  51. sol|=b;
  52. g<<sol<<'\n';
  53. m=(1LL*A*m+B)%mod;
  54. n=(1LL*A*n+B)%mod;
  55. }
  56. }
  57. void sub_optim_log()
  58. {
  59. f>>q>>n>>m>>A>>B>>mod;
  60. for(;q;q--)
  61. {
  62. for(b=1,sol=0;b<=(1<<30)&&m>=b;b<<=1)
  63. if(Clog(m-b,n+b))
  64. sol|=b;
  65. if(sol)g<<sol;
  66. m=(1LL*A*m+B)%mod;
  67. n=(1LL*A*n+B)%mod;
  68. }
  69. }
  70. void comb()
  71. {
  72. f>>q>>n>>m>>A>>B>>mod;
  73. for(;q;q--)
  74. {
  75. for(j=0,k=m,sol=0;k;j++,k--)
  76. if(C(n-1,j))
  77. sol^=k;
  78. if(sol)g<<sol;
  79. m=(1LL*A*m+B)%mod;
  80. n=(1LL*A*n+B)%mod;
  81. }
  82. }
  83. void sub_comb_log()
  84. {
  85. f>>q>>n>>m>>A>>B>>mod;
  86. for(;q;q--)
  87. {
  88. for(j=0,k=m,sol=0;k;j++,k--)
  89. if(Clog(n-1,j))
  90. sol^=k;
  91. if(sol)g<<sol;
  92. m=(1LL*A*m+B)%mod;
  93. n=(1LL*A*n+B)%mod;
  94. }
  95. }
  96. int Clog(int u,int v)
  97. {
  98. if(u==0||v==0)return 1;
  99. int bu=u&(-u),bv=v&(-v);
  100. if(bu==bv)return 0;
  101. if(bu<bv)return Clog(u-bu,v);
  102. return Clog(u,v-bv);
  103. }
Add Comment
Please, Sign In to add comment