EntropyIncreaser

HDU 6758

Jul 21st, 2020
1,499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <cctype>
  7.  
  8. #include <algorithm>
  9. #include <random>
  10. #include <bitset>
  11. #include <queue>
  12. #include <functional>
  13. #include <set>
  14. #include <map>
  15. #include <vector>
  16. #include <chrono>
  17. #include <iostream>
  18. #include <limits>
  19. #include <numeric>
  20.  
  21. #define LOG(FMT...) fprintf(stderr, FMT)
  22.  
  23. using namespace std;
  24.  
  25. // template from https://sinker.blog.luogu.org/solution-p4239
  26.  
  27. constexpr int Mod = 1000000009;
  28. using ll=long long;
  29.  
  30. struct Z {
  31.   static constexpr int Mod1 = 645922817, Mod2 = 897581057, Mod3 = 998244353;
  32.   int a, b, c;
  33.  
  34.   Z(const int &x = 0) : a(x % Mod1), b(x % Mod2), c(x % Mod3) {}
  35.  
  36.   Z(const int &a, const int &b, const int &c) : a(a), b(b), c(c) {}
  37.  
  38.   Z &up() {
  39.     a += a >> 31 & Mod1;
  40.     b += b >> 31 & Mod2;
  41.     c += c >> 31 & Mod3;
  42.     return *this;
  43.   }
  44.  
  45.   Z &operator+=(const Z &rhs) {
  46.     a += rhs.a - Mod1;
  47.     b += rhs.b - Mod2;
  48.     c += rhs.c - Mod3;
  49.     return up();
  50.   }
  51.  
  52.   Z operator-(const Z &rhs) const { return Z(a - rhs.a, b - rhs.b, c - rhs.c).up(); }
  53.  
  54.   Z operator*(const Z &rhs) const {
  55.     return Z(static_cast<ll>(a) * rhs.a % Mod1, static_cast<ll>(b) * rhs.b % Mod2, static_cast<ll>(c) * rhs.c % Mod3);
  56.     return *this;
  57.   }
  58.  
  59.   int val(const int &Mod) {
  60.     ll _a = (b - a + Mod2) % Mod2 * 867661692ll % Mod2 * Mod1 + a;
  61.     return ((c - _a % Mod3 + Mod3) % Mod3 * 13864533 % Mod3 * Mod1 % Mod * Mod2 + _a) % Mod;
  62.   }
  63. };
  64.  
  65. inline int qpow(int a, int p, int Mod, int s = 1) {
  66.   for (; p; p >>= 1, a = static_cast<ll>(a) * a % Mod) if (p & 1) s = static_cast<ll>(s) * a % Mod;
  67.   return s;
  68. }
  69.  
  70. int exgcd(int a, int b, int &x, int &y) {
  71.   if (!b) return x = 1, y = 0, a;
  72.   int d = exgcd(b, a % b, y, x);
  73.   y -= a / b * x;
  74.   return d;
  75. }
  76.  
  77. inline int _inv(const int &a) {
  78.   int x, _;
  79.   exgcd(a, Mod, x, _);
  80.   return x += x >> 31 & Mod;
  81. }
  82.  
  83. inline Z inv(const Z &rhs) {
  84.   int x1, x2, x3, _;
  85.   exgcd(rhs.a, Z::Mod1, x1, _);
  86.   exgcd(rhs.b, Z::Mod2, x2, _);
  87.   exgcd(rhs.c, Z::Mod3, x3, _);
  88.   return Z(x1, x2, x3).up();
  89. }
  90.  
  91. constexpr int mxlen = 1 << 20;
  92. int r[mxlen], d;
  93. Z w[mxlen];
  94.  
  95. void fftinit(int len) {
  96.   int _d = (d = __builtin_ctz(len)) - 1;
  97.   for (int i = 1; i < len; ++i) r[i] = r[i >> 1] >> 1 | (i & 1) << _d;
  98.   Z wn(qpow(3, Z::Mod1 >> d, Z::Mod1), qpow(3, Z::Mod2 >> d, Z::Mod2), qpow(3, Z::Mod3 >> d, Z::Mod3));
  99.   w[len >> 1] = 1;
  100.   for (int i = (len >> 1) + 1; i < len; ++i) w[i] = w[i - 1] * wn;
  101.   for (int i = len >> 1; --i;) w[i] = w[i << 1];
  102. }
  103.  
  104. void dft(Z a[], int len) {
  105.   int shift = d - __builtin_ctz(len);
  106.   for (int i = 0; i < len; ++i) if (i < r[i] >> shift) std::swap(a[i], a[r[i] >> shift]);
  107.   for (int l = 1; l < len; l <<= 1)
  108.     for (int i = 0; i < len; i += l << 1)
  109.       for (int j = 0; j < l; ++j) {
  110.         Z tmp(a[i + j + l] * w[j + l]);
  111.         a[i + j + l] = a[i + j] - tmp;
  112.         a[i + j] += tmp;
  113.       }
  114. }
  115.  
  116. void idft(Z a[], int len) {
  117.   std::reverse(a + 1, a + len);
  118.   dft(a, len);
  119.   Z invn(inv(len));
  120.   for (int i = 0; i < len; ++i) a[i] = a[i] * invn;
  121. }
  122.  
  123. void pinv(Z a[], Z b[], int n) {
  124.   if (n == 1) return void(*b = _inv(a->val(Mod)));
  125.   pinv(a, b, (n + 1) >> 1);
  126.   int len = 1;
  127.   while (len <= n * 3 / 2) len <<= 1;
  128.   static Z c[mxlen], d[mxlen];
  129.   __builtin_memcpy(c, a, sizeof(Z) * n);
  130.   __builtin_memcpy(d, b, sizeof(Z) * n);
  131.   for (int i = n; i < len; ++i) c[i] = d[i] = 0;
  132.   dft(c, len);
  133.   dft(d, len);
  134.   for (int i = 0; i < len; ++i) c[i] = c[i] * d[i];
  135.   idft(c, len);
  136.   for (int i = 0; i < len; ++i) c[i] = Mod - c[i].val(Mod);
  137.   dft(c, len);
  138.   for (int i = 0; i < len; ++i) c[i] = c[i] * d[i];
  139.   idft(c, len);
  140.   for (int i = (n + 1) >> 1; i < n; ++i) b[i] = c[i].val(Mod);
  141. }
  142.  
  143. Z A[mxlen], B[mxlen];
  144. int Bernoulli[mxlen];
  145.  
  146. int main() {
  147. #ifdef ELEGIA
  148.   freopen("test.in", "r", stdin);
  149.   int nol_cl = clock();
  150. #endif
  151.   ios::sync_with_stdio(false);
  152.   cin.tie(nullptr);
  153.  
  154.   {
  155.     int n = 400001;
  156.     int x = 1;
  157.     for (int i = 0; i < n; ++i) {
  158.       A[i] = x;
  159.       x = x * (ll) qpow(i + 2, Mod - 2, Mod) % Mod;
  160.     }
  161.     int len = 1;
  162.     while (len <= n * 3 / 2) len <<= 1;
  163.     fftinit(len);
  164.     pinv(A, B, n);
  165.     int fac = 1;
  166.     for (int i = 0; i < n; ++i) {
  167.       Bernoulli[i] = B[i].val(Mod) * (ll)fac % Mod;
  168.       fac = fac * (1LL + i) % Mod;
  169.     }
  170.   }
  171.  
  172.   int T;
  173.   cin >> T;
  174.   while (T--) {
  175.     int n;
  176.     cin >> n;
  177.     int ans = (Mod - 2 * n) * (ll)Bernoulli[4 * n] % Mod * qpow(Bernoulli[2 * n], Mod - 3, Mod) % Mod;
  178.     cout << ans << '\n';
  179.   }
  180.  
  181. #ifdef ELEGIA
  182.   LOG("Time: %dms\n", int ((clock()
  183.           -nol_cl) / (double)CLOCKS_PER_SEC * 1000));
  184. #endif
  185.   return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment