Loading

CF2147G Modular Tetration(数论,线性筛,*)

CF2147G Modular Tetration

Let \(T = a ^ {a ^ {a ^ {. ^ {. ^ .}}}}\),

\[T \equiv 1 \pmod m \leftrightarrow a = 1 \lor (a \perp m \land T \equiv 0 \pmod {\varphi(m)}) \leftrightarrow a\perp m \land \mathbb{L}(\text{ord}_m(a)) | a \]

\[\begin{aligned} \text{Density} &= \frac{1}{m\varphi(m)}\sum_{a \le m \varphi(m) \land a\perp m} [\mathbb{L}(\text{ord}_m(a)) | a]\\ &= \frac{1}{m\varphi(m)}\sum_{x | \varphi(m) \land x\perp m} \sum_{a \le m\varphi(m)} [\text{ord}_m(a \bmod m) = x \land \mathbb{L}(x) | a]\\ &= \frac{1}{m}\sum_{x | \varphi(m) \land x\perp m} \frac{\text{cnt}_m(x)}{\mathbb{L}(x)}\\ \end{aligned} \]

Where \(\text{cnt}_m(x) = \sum_{a \le m} [\text{ord}_m(a) = x]\).

For \(p \in \mathbb{P}\land p \ge 3, u = p ^ \alpha:\)

\[\forall 1 \le i < u \land i \perp u: i = f(k) = g ^ k, \text{ord}_u(i) = \frac{\varphi(u)}{\gcd(\varphi(u), k)} \]

\[\therefore \text{cnt}_u(x) = \varphi(x) \]

Suppose that \(m = \prod_{i = 1} ^ {|p|} p_i ^ {\alpha_i}\),

let \(k | \varphi(m)\land k \perp m: s(m, k) = \sum_{x | k} \text{cnt}_m(x)\):

since \(\varphi * 1 = id\), \(s(p_i ^ {\alpha_i}, k) = \sum_{x | k} \varphi(x) = k\), so

\[\begin{aligned} s(m, k) &= \sum_{a \le m} [a ^ k \equiv 1 \pmod m]\\ &= \sum_{a \le m} \prod_{i = 1} ^ {|p|} [a ^ k \equiv 1 \pmod {p_i ^ {\alpha_i}}]\\ &= \sum_{a \le m} \prod_{i = 1} ^ {|p|} [a ^ {\gcd(k, \varphi(p_i ^ {\alpha_i}))} \equiv 1 \pmod {p_i ^ {\alpha_i}}]\\ &= \prod_{i = 1} ^ {|p|} \sum_{a \le p_i ^ {\alpha_i}} [a ^ {\gcd(k, p_i - 1)} \equiv 1 \pmod {p_i ^ {\alpha_i}}]\\ &= \prod_{i = 1} ^ {|p|} s(p_i ^ {\alpha_i}, \gcd(k, p_i - 1)) = \prod_{i = 1} ^ {|p|} \gcd(k, p_i - 1)\\ \end{aligned} \]

Suppose \(k | \varphi(m) \land k \perp m: l(k) = \sum_{\mathbb L (x) | k} \text{cnt}_m(x)\),

suppose \(\varphi(m) \not\leftarrow m = \frac{\varphi(m)}{\gcd(m, \varphi(m))} = \prod_{i = 1} ^ {|q|} q_i ^ {\beta_i}\)

suppose \(\mathbb E_m(k) = \gcd(k ^ {\infty}, \varphi(m)) = \prod_{i \in [k]} q_i ^ {\beta_i}\):

\[\therefore l(k) = s(m, \mathbb E_m(k)) = \prod_{i = 1} ^ {p} \gcd(\mathbb E_m(k), p_i - 1) = \mathbb E_m(k) = \prod_{i \in [k]} q_i ^ {\beta_i} \]

\[\begin{aligned} \therefore \text{Density} &= \frac{1}{m}\sum_{x | \varphi(m) \land x\perp m} \frac{\text{cnt}_m(x)}{\mathbb{L}(x)}\\ &= \frac{1}{m}\sum_{[k]\subseteq [q]} \frac{1}{k} \sum_{[\mathbb L(x)] \subseteq [k]} (-1) ^ {|k| - [\mathbb L(x)]} l(k)\\ &= \frac{1}{m} \sum_{[k]\subseteq [q]} \prod_{i \in [k]} \frac{q_i ^ {\beta_i} - 1}{q_i}\\ &= \frac{1}{m} \prod_{i = 1} ^ {|q|} (1 + \frac{q_i ^ {\beta_i} - 1}{q_i})\\ \end{aligned} \]

Code

constexpr int mod = 998244353;

int power(int a, int x = mod - 2) {
	int p = 1;
	for (; x; x >>= 1) {
		if (x & 1) p = p * (ll)a % mod;
		a = a * (ll)a % mod;
	}
	return p;
}

int main() {
	const int N = 1000000;
	vector lp(N + 1, -1);
	vector<int> primes;
	for (int i = 2; i <= N; ++i) {
		if (!~lp[i]) {
			lp[i] = sz(primes);
			primes.push_back(i);
		}
		for (int j = 0; j <= lp[i] and i * primes[j] <= N; ++j) lp[i * primes[j]] = j;
	}
	cin.tie(0)->sync_with_stdio(false);
	int tt;
	cin >> tt;
	while (tt--) {
		auto collect = [&](int x, set<int>& f) {
			while (x > 1) {
				int p = primes[lp[x]];
				while (x % p == 0) x /= p;
				f.insert(p);
			}
		};
		int x, y, z;
		cin >> x >> y >> z;
		set<int> s, t; // t = m \ phi
		collect(x, s);
		collect(y, s);
		collect(z, s);
		ll phi = 1;
		for (int p : s) {
			int c = 0;
			for (int t = x; t % p == 0; t /= p) ++c;
			for (int t = y; t % p == 0; t /= p) ++c;
			for (int t = z; t % p == 0; t /= p) ++c;
			collect(p - 1, t);
			phi *= p - 1;
			folr(i, 1, c - 1) phi *= p;
		}
		int res = 1;
		for (int p : t) if (!s.count(p)) {
			int prod = 1;
			while (phi % p == 0) {
				phi /= p;
				prod = prod * (ll)p % mod;
			}
			res = res * ((ll)prod + p - 1) % mod * power(p) % mod;
		}
		ll m = x * (ll)y * z;
		res = res * (ll)power(m % mod) % mod;
		cout << res << '\n';
	}
}
posted @ 2025-09-22 14:55  Pizza1123  阅读(73)  评论(0)    收藏  举报