欧拉降幂
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL quick_pow(LL a,LL b,LL mod)
{
LL ret=1;
while(b)
{
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b=b/2;
}
return ret%mod;
}
LL phi(LL n)
{
LL ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
LL dfs(LL p)
{
if(p==1) return 0;
LL k=0;
while(p%2==0) p=p/2,k++;
LL phi_p=phi(p);
LL ans=dfs(phi_p);
LL res=(ans%phi_p-k%phi_p+phi_p)%phi_p;
res=quick_pow(2,res,p)%p;
return res<<k;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
LL p;
scanf("%lld",&p);
printf("%lld\n",dfs(p));
}
return 0;
}
浙公网安备 33010602011771号