luogu P4139 上帝与集合的正确用法
https://www.luogu.com.cn/problem/P4139
扩展欧拉定理
a
b
=
a
b
m
o
d
ϕ
(
p
)
+
ϕ
(
p
)
(
m
o
d
p
)
\large a^b=a^{b \mod \phi(p)+\phi(p)} (\mod p)
ab=abmodϕ(p)+ϕ(p)(modp)
带入即可
code:
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
#define N 10000005
using namespace std;
int prime[5000005], sz, phi[N];
bitset<N> vis;
void get_phi(int n){
for(int i = 2; i <= n; i ++){
if(!vis[i]){
prime[++ sz] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= sz && prime[j] * i <= n; j ++){
vis[prime[j] * i] = 1;
if(i % prime[j] == 0){
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
int poww(int x, int y, int mod){
int ans = 1;
for(; y; y >>= 1, x = x * x % mod) if(y & 1) ans = ans * x % mod;
return ans;
}
int f(int p){
if(p == 1) return 0;
int x = phi[p];
return poww(2, f(x) + x, p);
}
int t, p;
signed main(){
get_phi(10000000);
scanf("%lld", &t);
for(int i = 1; i <= t; i ++){
scanf("%lld", &p);
printf("%lld\n", f(p));
}
return 0;
}