a53

recc

a53
Apr 17th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define Bmax 1005
  5.  
  6. using namespace std;
  7.  
  8. ifstream fin("recc.in");
  9. ofstream fout("recc.out");
  10.  
  11. struct mat
  12. {
  13. int M[4][4];
  14. };
  15. mat Z;
  16.  
  17. ll N;
  18. int L;
  19. int B, X, K;
  20. int A[4];
  21. int vals[Bmax * Bmax];
  22. int cnt[Bmax * Bmax];
  23.  
  24. mat mult(mat A, mat B)
  25. {
  26. mat C;
  27. memset(C.M, 0, sizeof(C.M));
  28. for(int i = 0; i < 4; i++)
  29. for(int j = 0; j < 4; j++)
  30. for(int k = 0; k < 4; k++)
  31. C.M[i][j] = (C.M[i][j] + 1ll * A.M[i][k] * B.M[k][j]) % K;
  32. return C;
  33. }
  34.  
  35. mat pw(mat A, ll N)
  36. {
  37. if(N == 1)
  38. return A;
  39. if(N % 2 == 1)
  40. return mult(A, pw(A, N - 1));
  41. mat P = pw(A, N / 2);
  42. return mult(P, P);
  43. }
  44.  
  45. ll ans;
  46.  
  47. int freq(int v)
  48. {
  49. for(int le = 1, ri = L; le <= ri;)
  50. {
  51. int mid = (le + ri) / 2;
  52. if(vals[mid] == v)
  53. return cnt[mid];
  54. if(vals[mid] < v)
  55. le = mid + 1;
  56. else
  57. ri = mid - 1;
  58. }
  59. return 0;
  60. }
  61.  
  62. int main()
  63. {
  64. fin >> N >> B >> X >> K;
  65. for(int i = 0; i < 4; i++)
  66. fin >> A[i], Z.M[3 - i][3] = A[i] % K;
  67. for(int i = 0; i < 3; i++)
  68. Z.M[i + 1][i] = 1;
  69. Z = pw(Z, N - 4);
  70. for(int i = 0; i < 4; i++)
  71. A[i] = Z.M[i][3];
  72. L = 0;
  73. for(int i = 1; i <= B; i++)
  74. for(int j = 1; j <= B; j++)
  75. {
  76. int v = (1ll * A[0] * i % K + 1ll * A[1] * j % K) % K;
  77. vals[++L] = v;
  78. }
  79. sort(vals + 1, vals + L + 1);
  80. int newL = 1;
  81. cnt[1] = 1;
  82. for(int i = 2; i <= L; i++)
  83. if(vals[newL] != vals[i])
  84. vals[++newL] = vals[i], cnt[newL] = 1;
  85. else
  86. cnt[newL]++;
  87. L = newL;
  88. ll ans = 0;
  89. for(int i = 1; i <= B; i++)
  90. for(int j = 1; j <= B; j++)
  91. {
  92. int v = (1ll * A[2] * i % K + 1ll * A[3] * j % K) % K;
  93. v = (X - v + K) % K;
  94. ans += freq(v);
  95. }
  96. fout << ans << "\n";
  97. return 0;
  98. }
Add Comment
Please, Sign In to add comment