オイラーの定理を拡張
場合\(GCD(M) = 1 \) オイラーの定理である場合
二つの条件の後ろに\(GCD \)いいえ、注意\(C \)と\(\ PHI(M)\ ) の関係
\(説明\)
探している\(2 ^ {2 ^ {
2 ^ {2 ^ {\ cdots}}}}(MOD P)\) 酒のために簡略化\(X \当量2 ^ X (MOD P))\)
\(溶液\)
以降\(2 ^ {2 ^ {
2 ^ {2 ^ {\ cdots}}}}> \ PHI(P)\) と\(\ PHI(P)\ ) 第三の式、すなわちので、収縮することができる
使用(ANS(P)\)\発現(P \)\モジュロ答え、明らかに\(ANS(P)= 2 ^ {ANS(\ PHI(P))+ \ PHI(P)} \)
\(\ PHI(P)\ ) があるまで収縮\(1 \) 、次いで任意の数\(MOD 1 = 0 \) 、それは再帰的リターンの境界に到達\(0 \)に
\(コード\)
#include <cstdio>
#define int long long
typedef long long ll;
const int N = 1e7+71;
int p_(ll x, int y, int z) {
int ret = 1;
for (; y; (x *= x) %= z, y >>= 1) if (y & 1) (ret *= x) %= z;
return ret;
}
signed phi[N];
ll solve(int p) {
if (p == 1) return 0;
return p_(2, solve(phi[p]) + phi[p], p);
}
int t, p;
signed main() {
phi[1] = 1;
for (signed i = 2; i < N; i++) if (!phi[i]) {
for (signed j = i; j < N; j += i) {
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i-1);
}
}
for (scanf("%lld", &t); t--; ) {
scanf("%lld", &p);
printf("%lld\n", solve(p));
}
}