扩展欧拉定理揭示了对于任意模数 ,有
我们又知道若分解质因数 ,则 。则若 ,若 ,;否则,。记 ,则 级别的 就能使其收敛到 。
因此对于 上的超-4运算 ,结合扩展欧拉定理得到,在指数塔的 层就将得到 的指数。从而它是收敛的。
洛谷题库 P3747 [六省联考 2017] 相逢是问候
一道可以此解决的构造题 – MOCK PTS 20231127 A
给出 组询问,。每次给定正整数 ,求出一个
int64_t
范围内的正整数 ,满足 。
令 是极小的满足 的整数。如果 在 上不超过范围限制,我们直接输出即可。
否则,若 ,由扩展欧拉定理及题目原式,它须满足 (由于 在 上远超 ,故只需保证 意义下相同即可。)
因此我们求出 意义下的 ,使用扩展中国剩余定理合并两方程(根据结果反推得 exCRT 必然成立)就得到 意义下的 ,它符合范围要求。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
#include <bits/stdc++.h> using namespace std; #define inl inline typedef long long ll; typedef unsigned long long ull; // typedef __int128 lll; // typedef long double llf; typedef pair <int, int> pint; #define fst first #define scd second #define all(p) begin (p), end (p) #define empb emplace_back int T, a, m; unordered_map <int, int> rec; inl int phi (int m) { int &x = rec[m]; if (x) return x; else x = 1; for (int p = 2; p * p <= m; ++p) { if (m % p) continue; while (m % p == 0) m /= p, x *= p; x /= p, x *= p - 1; } if (m > 1) x *= m - 1; return x; } inl ll fpow (ll a, ll b, const int mod) { ll c = 1; a %= mod; for (; b; b >>= 1) { if (b & 1) (c *= a) %= mod; (a *= a) %= mod; } return c; } int tetra (int a, int b, int m) { static int _x; if (!b) return _x = 1, 1 % m; const int p = phi (m); int x = tetra (a, b - 1, p); if (_x == -1 || _x >= p) x = fpow (a, x + p, m); else x = fpow (a, x, m); return _x == -1 || pow (a, _x) > INT_MAX ? -1 : fpow (a, _x, INT_MAX), x; } inl ll exgcd (ll a, ll b, ll &x, ll &y) { if (!b) return x = 1, y = 0, a; ll d = exgcd (b, a % b, y, x); return y -= a / b * x, d; } inl int f (int a, int m) { int l = 1, r = 60, mid; while (l < r) { mid = l + r >> 1; if (tetra (a, mid, m) == tetra (a, mid - 1, m)) r = mid; else l = mid + 1; } return l; } int main () { /* */ scanf ("%d", &T); while (T--) { scanf ("%d%d", &a, &m); int t = f (a, m), x1 = tetra (a, t, m), x2 = tetra (a, t, phi (m)); ll u, v, d = exgcd (m, phi (m), u, v); const ll p = (ll) m * phi (m) / d, q = (x2 - x1) / d; ll y = ((__int128_t) u * q * m + x1) % p + p; printf ("%lld\n", y); } return 0; }
另一种解法
我们试图求 的一个解。
令 ,则
上式有解的充分必要条件是 ,也即 。不难发现,我们总可以调整系数 使 ;于是令 ,递归解决子问题。边界是 时 。