1 条题解
-
0

#include <bits/stdc++.h> #define lg2 std::__lg using std::cin; using std::cout; typedef long long ll; const int N = 132000, mod = 998244853; int fact[N], finv[N]; inline void add(int &x, const int y) {x += y - mod, x += x >> 31 & mod;} ll PowerMod(ll a, int n, ll c = 1) {for (; n; n >>= 1, a = a * a % mod) if (n & 1) c = c * a % mod; return c;} void init() { int i; for (*fact = i = 1; i < N; ++i) fact[i] = (ll)fact[i - 1] * i % mod; --i, finv[i] = PowerMod(fact[i], mod - 2); for (; i; --i) finv[i - 1] = (ll)finv[i] * i % mod; } inline ll C(int n, int r) {return (ll)fact[n] * finv[r] % mod * finv[n - r] % mod;} namespace Poly { typedef std::complex <double> C; int l, n, rev[N]; C x[N], y[N], B1[N], B2[N], B3[N], B4[N]; void FFT_init(int len) { if (l == len) return; n = 1 << (l = len); int i; double angle = M_PI; for (i = l - 1; i >= 0; angle *= .5, --i) x[1 << i] = C(cos(angle), sin(angle)); for (i = 3; i < n; ++i) if (i & (i - 1)) x[i] = x[i & -i] * x[i ^ (i & -i)]; *x = C(1.), *rev = 0; for (i = 1; i < n; ++i) rev[i] = rev[i >> 1] >> 1 | (i & 1) << (l - 1); } void DFT(C *d, C *t) { int i, len = 1, delta = n; C *j, *k, R; for (i = 0; i < n; ++i) t[rev[i]] = d[i]; for (i = 0; i < l; ++i) { delta >>= 1; for (k = x, j = y; j < y + len; k += delta, ++j) *j = *k; for (j = t; j < t + n; j += len << 1) for (k = j; k < j + len; ++k) R = y[k - j] * k[len], k[len] = *k - R, *k += R; len <<= 1; } } void sqr(int deg, int *a, int *b) { if (!deg) {*b = (ll)*a * *a % mod; return;} FFT_init(lg2(deg) + 2); int i, j; double iv = 1. / n; C p, q, r; for (i = 0; i <= deg; ++i) B1[i] = C(a[i] & 32767, a[i] >> 15); std::fill(B1 + i, B1 + n, C()), DFT(B1, B3), B3[n] = *B3; for (i = 0, j = n; i < n; ++i, --j) p = (B3[i] + std::conj(B3[j])) * C(.5, 0.), q = (B3[i] - std::conj(B3[j])) * C(0., -.5), r = p + q * C(0., 1.), B1[j] = p * r, B2[j] = q * r; *B1 = B1[n], *B2 = B2[n], DFT(B1, B3), DFT(B2, B4); for (i = 0; i <= deg * 2; ++i) b[i] = (ll(B3[i].real() * iv + .5) + (ll((B3[i].imag() + B4[i].real()) * iv + .5) % mod << 15) + (ll(B4[i].imag() * iv + .5) % mod << 30) + mod) % mod; } } ll n; int K; int f[N], g[N]; void naive_sqr(int deg, int *a, int *b) { int i, j; for (i = 0; i <= deg; ++i) for (j = 0; j <= deg; ++j) b[i + j] = (b[i + j] + (ll)a[i] * a[j]) % mod; } void polyPowerMod(ll n, int d) { int i, z = lg2(n); bool alive = false; ll df = 1; auto sqr_algo = (d > 512 ? Poly::sqr : naive_sqr); for (; --z >= 0; ) { df = df << 1 | (n >> z & 1); if (df < d) continue; if (!alive) for (alive = true, i = 0; i <= df >> 1; ++i) f[i] = C(df >> 1, i); sqr_algo(d - 1, f, g); if (n >> z & 1) for (i = 2 * d - 1; i; --i) add(g[i], g[i - 1]); for (i = d - 1; i >= 0; --i) add(f[i] = g[i], g[i + d]), g[i] = g[i + d] = 0; } assert(df == n && alive); } int main() { cin >> n >> K, init(); if (K <= 1) return cout << PowerMod(2, n) << '\n', 0; if (n < K) return cout << '1' << '\n', 0; return polyPowerMod(n, K), cout << *f << '\n', 0; }
- 1
信息
- ID
- 4209
- 时间
- 4000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者