神とコレクションのBZOJ 3884適切な使用

オイラーの定理を拡張

場合\(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));
    }
}

おすすめ

転載: www.cnblogs.com/Liuz8848/p/11371548.html