1 条题解

  • 0
    @ 2026-1-16 21:58:12

    #include <bits/stdc++.h>
    #define lg2 std::__lg
    using std::cin;
    using std::cout;
    
    typedef unsigned long long u64;
    const int N = 1050000, mod = 998244353, iv2 = (mod + 1) / 2, unity = 31;
    typedef int vec[N], *pvec;
    
    vec inv, fact, finv;
    
    inline int min(const int x, const int y) {return x < y ? x : y;}
    inline int max(const int x, const int y) {return x < y ? y : x;}
    inline int & reduce(int &x) {return x += x >> 31 & mod;}
    inline int & neg(int &x) {return x = (!x - 1) & (mod - x);}
    u64 PowerMod(u64 a, int n, u64 c = 1) {for (; n; n >>= 1, a = a * a % mod) if (n & 1) c = c * a % mod; return c;}
    
    namespace poly_base {
    	int l, n; u64 iv; vec w2;
    
    	void init(int n = N, bool dont_calc_factorials = true) {
    		int i, t;
    		for (inv[1] = 1, i = 2; i < n; ++i) inv[i] = u64(mod - mod / i) * inv[mod % i] % mod;
    		if (!dont_calc_factorials) for (*finv = *fact = i = 1; i < n; ++i) fact[i] = (u64)fact[i - 1] * i % mod, finv[i] = (u64)finv[i - 1] * inv[i] % mod;
    		t = min(n > 1 ? lg2(n - 1) : 0, 21),
    		*w2 = 1, w2[1 << t] = PowerMod(unity, 1 << (21 - t));
    		for (i = t; i; --i) w2[1 << (i - 1)] = (u64)w2[1 << i] * w2[1 << i] % mod;
    		for (i = 1; i < n; ++i) w2[i] = (u64)w2[i & (i - 1)] * w2[i & -i] % mod;
    	}
    
    	inline void NTT_init(int len) {n = 1 << (l = len), iv = mod - (mod - 1) / n;}
    
    	void DIF(int *a) {
    		int i, *j, *k, len = n >> 1, R, *o;
    		for (i = 0; i < l; ++i, len >>= 1)
    			for (j = a, o = w2; j != a + n; j += len << 1, ++o)
    				for (k = j; k != j + len; ++k)
    					R = (u64)*o * k[len] % mod, reduce(k[len] = *k - R), reduce(*k += R - mod);
    	}
    
    	void DIT(int *a) {
    		int i, *j, *k, len = 1, R, *o;
    		for (i = 0; i < l; ++i, len <<= 1)
    			for (j = a, o = w2; j != a + n; j += len << 1, ++o)
    				for (k = j; k != j + len; ++k)
    					reduce(R = *k + k[len] - mod), k[len] = u64(*k - k[len] + mod) * *o % mod, *k = R;
    	}
    
    	inline void DNTT(int *a) {DIF(a);}
    	inline void IDNTT(int *a) {
    		DIT(a), std::reverse(a + 1, a + n);
    		for (int i = 0; i < n; ++i) a[i] = a[i] * iv % mod;
    	}
    
    	inline void DIF(int *a, int *b) {memcpy(b, a, n << 2), DIF(b);}
    	inline void DIT(int *a, int *b) {memcpy(b, a, n << 2), DIT(b);}
    	inline void DNTT(int *a, int *b) {memcpy(b, a, n << 2), DNTT(b);}
    	inline void IDNTT(int *a, int *b) {memcpy(b, a, n << 2), IDNTT(b);}
    }
    
    int pn = 0, c[500000], p[41554], d[N], de[500000];
    vec f;
    
    void sieve(int n) {
    	int i, j, v; d[1] = 1;
    	memset(c, -1, sizeof c);
    	for (i = 2; i <= n; ++i) {
    		if (!~c[i]) p[pn] = i, c[i] = pn++, d[i] = 2, de[i] = 1;
    		for (j = 0; (v = i * p[j]) <= n && j < c[i]; ++j) c[v] = j, d[v] = (de[v] = d[i]) * 2;
    		if (v <= n) c[v] = j, d[v] = d[i] + de[i], de[v] = de[i];
    	}
    }
    
    void work() {
    	int i;
    	namespace pb = poly_base;
    	sieve(499999), pb::init(), pb::NTT_init(20), pb::DIF(d);
    	for (i = 0; i < pb::n; ++i) d[i] = (u64)d[i] * d[i] % mod;
    	pb::DIT(d);
    	for (i = 2; i <= 500000; ++i) f[i] = d[pb::n - i] * pb::iv % mod;
    }
    
    int main() {
    	int i, l, r, q;
    	std::ios::sync_with_stdio(false), cin.tie(NULL);
    	work();
    	for (cin >> q; q; --q)
    		cin >> l >> r, i = std::max_element(f + l, f + (r + 1)) - f,
    		cout << i << ' ' << f[i] << '\n';
    	return 0;
    }
    
    • 1

    信息

    ID
    5780
    时间
    5000ms
    内存
    1028MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者