Advertisement
a53

E-BirocratieInterstelara

a53
Sep 9th, 2021
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAXN 1717171
  3. #define INF 1000000000000000000ll
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. ifstream fi("bir_interstelara.in");
  10. ofstream fo("bir_interstelara.out");
  11.  
  12. ll n, a, b, MOD, inv_a, bucket;
  13. ll Start[MAXN], rez, DP[MAXN], S1[MAXN], S2[MAXN];
  14.  
  15. ll inmult(ll a, ll b)
  16. {
  17. if(a == 0) return 0;
  18. if(a % 2)
  19. return (b + 2 * inmult(a/2, b) % MOD) % MOD;
  20. return 2 * inmult(a/2, b) % MOD;
  21. }
  22.  
  23. ll inversf(ll val) {
  24. val = (val - b + MOD) % MOD;
  25. val = inmult(val, inv_a) % MOD;
  26. return val;
  27. }
  28.  
  29. ll expr(ll v, ll p)
  30. {
  31. if(!p)return 1;
  32. if(p%2)
  33. return inmult(v, expr(inmult(v, v), p/2));
  34. return expr(inmult(v, v) % MOD, p/2);
  35. }
  36. unordered_map<ll, ll> Before;
  37. ll a_compus, b_compus;
  38.  
  39. ll distanta(ll val)
  40. {
  41. ll re = 0;
  42. if(Before.count(val))
  43. return Before[val];
  44. while(!Before.count(val)){
  45. val = (inmult(val, a_compus) + b_compus) % MOD; /// aplica functia de bucket ori
  46. re += bucket;
  47. }
  48. re += Before[val];
  49. return re;
  50. }
  51.  
  52. ll inv(ll val)
  53. {
  54. return expr(val, MOD-2);
  55. }
  56.  
  57. void solve(ll R[])
  58. {
  59. if(MOD <= 1000000) {
  60. for(int i = 0; i < MOD; ++i)
  61. DP[i] = INF;
  62. DP[0] = 0;
  63. ///varianta usoara
  64. ll x = 0, y = 0;
  65. do {
  66. y = inversf(x);
  67. DP[y] = DP[x] + 1;
  68. x = y;
  69. } while(y);
  70. DP[0] = 0;
  71. for(ll i = 1; i <= n; ++i)
  72. R[i] = DP[Start[i]];
  73. } else {
  74. ///cazul dificil
  75. ll x = 0;
  76. for(ll i = 0; i <= bucket + 2; ++i) {
  77. if(Before.count(x)) break;
  78. Before[x] = i;
  79. x = inversf(x);
  80. }
  81.  
  82. a_compus = expr(a, bucket);
  83. b_compus = inmult((expr(a, bucket) - 1 + MOD) % MOD, inmult(inv(a-1), b));
  84.  
  85. for(ll i = 1; i <= n; ++i)
  86. R[i] = distanta(Start[i]);
  87. Before.clear();
  88. }
  89. }
  90.  
  91. int main()
  92. {
  93. fi >> n >> a >> b >> MOD;
  94. bucket = (int)(sqrt(MOD) + .5);
  95. inv_a = expr(a, MOD-2);
  96. for(ll i = 1; i <= n; ++i)
  97. fi >> Start[i];
  98. solve(S1);
  99. b = (MOD - inmult(inv_a, b)) % MOD;
  100. swap(a, inv_a);
  101. solve(S2);
  102.  
  103. for(int i = 1; i <= n; ++i)
  104. rez += min(S1[i], S2[i]);
  105. fo << rez << "\n";
  106. return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement