Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector,unroll-all-loops,unroll-loops")
  2. #pragma GCC target("abm,mmx,sse,sse2,sse3,ssse3,sse4a,popcnt,tune=native")
  3. #include <iostream>
  4. #include <vector>
  5. #include <unordered_map>
  6. #include <algorithm>
  7. #include <random>
  8.  
  9. using namespace std;
  10.  
  11. #define int int64_t
  12.  
  13. const long long mod = 786433;
  14. const int root = 5;
  15.  
  16. long long pow_(long long a, long long b) {
  17. if (b == 0)
  18. return 1;
  19. long long p = pow_(a, b / 2);
  20. if (b % 2 == 0)
  21. return p * p % mod;
  22. else
  23. return (p * p % mod) * a % mod;
  24. }
  25.  
  26. int rev(int num, int len) {
  27. int res = 0;
  28. for (int i = 0; i < len; i++)
  29. if (num & (1 << i))
  30. res |= 1 << (len - i - 1);
  31. return res;
  32. }
  33.  
  34. void fft(vector <int> &a, int n, bool inv) {
  35. int log_ = 0;
  36. while ((1 << log_) < n)
  37. ++log_;
  38. for (int i = 0; i < n; i++)
  39. if (i < rev(i, log_))
  40. swap(a[i], a[rev(i, log_)]);
  41. for (int len = 2; len <= n; len <<= 1) {
  42. long long wlen = pow_(root, (mod - 1) / len);
  43. for (int j = 0; j < n; j += len) {
  44. long long w = 1;
  45. for (int k = j; k < j + len / 2; k++) {
  46. long long u = a[k];
  47. long long v = w * a[k + len / 2] % mod;
  48. a[k] = (u + v) % mod;
  49. a[k + len / 2] = (u - v + mod) % mod;
  50. w = w * wlen % mod;
  51. }
  52. }
  53. }
  54. if (inv == true) {
  55. for (int i = 0; i < n; i++)
  56. if (i + 1 < n - 1 - i)
  57. swap(a[i + 1], a[n - 1 - i]);
  58. long long kek = pow_(n, mod - 2);
  59. for (int i = 0; i < n; i++)
  60. a[i] = a[i] * kek % mod;
  61. }
  62. }
  63.  
  64. vector <int> operator *(vector <int> a, vector <int> b) {
  65. int n = 1;
  66. while (n < (int)a.size() + (int)b.size())
  67. n <<= 1;
  68. a.resize(n);
  69. b.resize(n);
  70. fft(a, n, false);
  71. fft(b, n, false);
  72. vector <int> c(n);
  73. for (int i = 0; i < n; i++)
  74. c[i] = a[i] * b[i] % mod;
  75. fft(c, n, true);
  76. while (c.size() > 1 && c.back() == 0)
  77. c.pop_back();
  78. return c;
  79. }
  80.  
  81. vector <int> operator *(long long k, const vector <int> &a) {
  82. vector <int> b((int)a.size());
  83. for (int i = 0; i < (int)b.size(); i++)
  84. b[i] = ((long long)a[i] * k) % mod;
  85. return b;
  86. }
  87.  
  88. vector <int> operator +(vector <int> a, vector <int> b) {
  89. int n = max((int)a.size(), (int)b.size());
  90. a.resize(n);
  91. b.resize(n);
  92. vector <int> c(n);
  93. for (int i = 0; i < n; i++)
  94. c[i] = (a[i] + b[i]) % mod;
  95. return c;
  96. }
  97.  
  98.  
  99. int32_t main() {
  100. cin.tie(0);
  101. ios::sync_with_stdio(false);
  102. int n, h;
  103. cin >> n >> h;
  104. vector <int> h_2 = {1};
  105. vector <int> h_1 = {0, 1};
  106. vector <int> result = h_1;
  107.  
  108. for (int t = 1; t <= h; t++) {
  109. result = (h_1 * h_1 + 2 * h_2 * h_1);
  110. result.push_back(0);
  111. for (int i = (int)result.size() - 1; i >= 1; i--)
  112. result[i] = result[i - 1];
  113. result[0] = 0;
  114. h_2 = h_1;
  115. h_1 = result;
  116. }
  117. cout << result[n] << endl;
  118. return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement