题意
,满足任意有,给定求(粗略的就这么理解)
题解
首先注意到着手点应该是,对于次方的模,若
- 若,问题就变为求解,根据假设知
- 若,,对于指数中,求解即可
- 最终状态即为,最好特判的情况
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 1e7 + 5;
int T, P;
bool noprime[MAXN];
int prime[MAXN], cnt_p, phi[MAXN];
void Euler_Sieve(int top);
int qpow(int, int, int);
int solve(int);
int main(){
ios::sync_with_stdio(false);
Euler_Sieve(MAXN - 5);
cin >> T;
while(T--){
cin >> P;
cout << solve(P) << endl;
}
return 0;
}
int solve(int p){
if(p == 1 || p == 2) return 0;
if(p % 2 != 0){
return qpow(2, solve(phi[p]) % phi[p], p);
}else{
int k = 0, q = p;
while(p % 2 == 0) p /= 2, k++;
if(p == 1) return 0;
return 1LL * qpow(2, (solve(phi[p]) % phi[p] - k % phi[p] + phi[p]) % phi[p], p) * qpow(2, k, q) % q;
}
}
int qpow(int x, int n, int mod){
int res = 1;
while(n){
if(n & 1) res = 1LL * res * x % mod;
x = 1LL * x * x % mod;
n >>= 1;
}
return res;
}
void Euler_Sieve(int top){
phi[1] = 1;
int i, j;
for(i = 2; i <= top; i++){
if(!noprime[i]) prime[++cnt_p] = i, phi[i] = i - 1;
for(j = 1; j <= cnt_p && prime[j] * i <= top; j++){
noprime[prime[j] * i] = true;
if(i % prime[j] == 0){
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}