| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 
 | #include <cstdio>#include <algorithm>
 using namespace std;
 template <class Type>
 void read (Type &x)
 {
 char c;
 bool flag = false;
 while ((c = getchar()) < '0' || c > '9')
 flag |= c == '-';
 x = c - '0';
 while ((c = getchar()) >= '0' && c <= '9')
 x = (x << 3) + (x << 1) + c - '0';
 if (flag) x = ~x + 1;
 }
 template <class Type, class ...Rest>
 void read (Type &x, Rest &...y) { read(x); read(y...); }
 template <class Type>
 void write (Type x)
 {
 if (x < 0) putchar('-'), x = ~x + 1;
 if (x > 9) write(x / 10);
 putchar('0' + x % 10);
 }
 typedef long long LL;
 const int N = 5e5 + 10, mod = 1004535809, inv2 = mod + 1 >> 1;
 int rev[N];
 int binpow (int b, int k = mod - 2)
 {
 int res = 1;
 for (; k; k >>= 1, b = (LL)b * b % mod)
 if (k & 1) res = (LL)res * b % mod;
 return res;
 }
 void ntt (int *x, int bit, int op)
 {
 int tot = 1 << bit;
 for (int i = 1; i < tot; ++i)
 if ((rev[i] = rev[i >> 1] >> 1 | (i & 1) << bit - 1) > i)
 swap(x[rev[i]], x[i]);
 for (int mid = 1; mid < tot; mid <<= 1)
 {
 int w1 = binpow(3, (mod - 1) / (mid << 1));
 if (!~op) w1 = binpow(w1);
 for (int i = 0; i < tot; i += mid << 1)
 for (int j = 0, k = 1; j < mid; ++j, k = (LL)k * w1 % mod)
 {
 int p = x[i | j], q = (LL)k * x[i | j | mid] % mod;
 x[i | j] = (p + q) % mod, x[i | j | mid] = (p - q) % mod;
 }
 }
 if (~op) return;
 int itot = binpow(tot);
 for (int i = 0; i < tot; ++i)
 x[i] = (LL)x[i] * itot % mod;
 }
 void PolyMul (int n, int *f, int m, int *g, int nm, int *res)
 {
 int bit = 0;
 while (1 << bit < n + m - 1) ++bit;
 int tot = 1 << bit;
 for (int i = n; i < tot; ++i) f[i] = 0;
 for (int i = m; i < tot; ++i) g[i] = 0;
 ntt(f, bit, 1), ntt(g, bit, 1);
 for (int i = 0; i < tot; ++i)
 res[i] = (LL)f[i] * g[i] % mod;
 ntt(res, bit, -1);
 for (int i = nm; i < tot; ++i) res[i] = 0;
 }
 void PolyInv(int n, int *x, int *g)
 {
 if (n == 1) return void(g[0] = binpow(x[0]));
 int m = n + 1 >> 1;
 int bit = 0;
 while (1 << bit < n + m + m - 2) ++bit;
 int tot = 1 << bit;
 PolyInv(m, x, g);
 for (int i = m; i < tot; ++i) g[i] = 0;
 static int A[N];
 for (int i = 0; i < n; ++i) A[i] = x[i];
 for (int i = n; i < tot; ++i) A[i] = 0;
 ntt(g, bit, 1), ntt(A, bit, 1);
 for (int i = 0; i < tot; ++i)
 g[i] = (2 - (LL)g[i] * A[i]) % mod * g[i] % mod;
 ntt(g, bit, -1);
 for (int i = n; i < tot; ++i) g[i] = 0;
 }
 void PolyDerivate(int n, int *x, int *g)
 {
 for (int i = 1; i < n; ++i)
 g[i - 1] = (LL)x[i] * i % mod;
 g[n - 1] = 0;
 }
 void PolyIntegrate(int n, int *x, int *g)
 {
 for (int i = 1; i < n; ++i)
 g[i] = (LL)x[i - 1] * binpow(i) % mod;
 g[0] = 0;
 }
 void PolyLn(int n, int *x, int *g)
 {
 static int A[N], B[N];
 PolyDerivate(n, x, A);
 PolyInv(n, x, B);
 PolyMul(n, A, n, B, n, A);
 PolyIntegrate(n, A, g);
 }
 int main ()
 {
 static int n, A[N], B[N];
 read(n);
 for (int i = 0, t = 1; i <= n; t = (LL)t * ++i % mod)
 A[i] = (LL)binpow(t) * binpow(2, i * (i - 1ll) / 2 % (mod - 1)) % mod;
 PolyLn(n + 1, A, B);
 int k = 1;
 for (int i = 2; i <= n; ++i)
 k = (LL)k * i % mod;
 write(((LL)k * B[n] % mod + mod) % mod);
 return 0;
 }
 
 |