1 条题解

  • 0
    @ 2026-1-16 22:13:38

    #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
    上传者