1 条题解

  • 0
    @ 2026-1-16 23:14:40

    #include <bits/stdc++.h>
    #define lg2(x) (31 - __builtin_clz(x))
    
    typedef long long ll;
    const int N = 135400, mod = 998244353, root = 31;
    typedef int vec[N], *pvec;
    
    int n, q;
    vec l, f, g, r;
    
    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;}
    
    namespace Poly {
    	int l, n;
    	vec rev, x, y;
    
    	void NTT_init(int len) {
    		if (l == len) return; n = 1 << (l = len);
    		ll g = PowerMod(root, 1 << (23 - l));
    		*x = 1, *rev = 0;
    		for (int i = 1; i < n; ++i)
    			x[i] = x[i - 1] * g % mod, rev[i] = rev[i >> 1] >> 1 | (i & 1) << (l - 1);
    	}
    
    	void DNTT(int *d, int *t) {
    		int i, *j, *k, len = 1, delta = n, 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 = (ll)y[k - j] * k[len] % mod;
    					k[len] = (*k - R < 0 ? *k - R + mod : *k - R);
    					*k = (*k + R >= mod ? *k + R - mod : *k + R);
    				}
    			len <<= 1;
    		}
    	}
    
    	vec B1, B2, B3;
    	void Mul(int degA, int degB, pvec a, pvec b, pvec c) {
    		if (!degA && degB == 1) {*c = (ll)*a * *b % mod, c[1] = *a * b[1] % mod; return;}
    		if (degA == 1 && !degB) {*c = (ll)*a * *b % mod, c[1] = a[1] * *b % mod; return;}
    		NTT_init(lg2(degA + degB) + 1);
    		int i; ll iv = mod - (mod - 1) / n;
    		memcpy(B1, a, (degA + 1) << 2), memset(B1 + (degA + 1), 0, (n - degA - 1) << 2);
    		memcpy(B2, b, (degB + 1) << 2), memset(B2 + (degB + 1), 0, (n - degB - 1) << 2);
    		DNTT(B1, B3), DNTT(B2, B1);
    		for (i = 0; i < n; ++i) B1[i] = (ll)B1[i] * B3[i] % mod;
    		DNTT(B1, B3), std::reverse(B3 + 1, B3 + n);
    		for (i = 0; i <= degA + degB; ++i) c[i] = B3[i] * iv % mod;
    	}
    }
    
    void solve(int L, int R) {
    	int i, M = (L + R + 1) / 2;
    	if (L + 1 == R) {
    		add(f[L], f[L - 1]), add(f[L], g[L - 1]), g[L] = f[L] * (L - 1ll) % mod; return;
    	}
    	solve(L, M);
    	if (L) {
    		Poly::Mul(M - L - 1, R - L - 1, f + L, g, r);
    		for (i = M; i < R; ++i) add(f[i], r[i - L]);
    		Poly::Mul(R - L - 1, M - L - 1, f, g + L, r);
    		for (i = M; i < R; ++i) add(f[i], r[i - L]);
    	} else {
    		Poly::Mul(M - 1, M - 1, f, g, r);
    		for (i = M; i < R; ++i) add(f[i], r[i]);
    	}
    	solve(M, R);
    }
    
    int main() {
    	int i, j, p, ans;
    	scanf("%d%d", &q, &n), f[2] = 2, solve(0, n), *f = 1, f[1] = 2;
    	for (; q; --q) {
    		for (i = 1; i <= n; ++i) scanf("%d", l + i);
    		for (ans = 1, i = (l[n] == n ? 1 : n + 2); i <= n; ++i) {
    			for (p = 0, j = i - 1; j > i - l[i]; j -= l[j], ++p);
    			if (j != i - l[i]) break;
    			ans = (ll)ans * f[p] % mod;
    		}
    		printf("%d\n", i == n + 1 ? ans : 0);
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    4683
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者