在2与模数
p
互质的情况下,我们考虑超级幂,对指数模
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int t;
int p;
int phi(int n)
{
int ans;
int m,i;
m=sqrt(n);
ans=n;
for (i=2;i<=m;++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;
}
int power(long long a,int b,int p)
{
long long ans;
for(ans=1;b;b>>=1,a=a*a%p) if(b&1) ans=ans*a%p;
return (ans+p)%p;
}
int work(int p)
{
int phip,ans,t=0;
if (p==1) return 0;
while (p%2==0) {p/=2; t++;}
phip=phi(p);
ans=power(2,(work(phip)+phip-t%phip)%phip,p);
ans=ans<<t;
return ans;
}
int main()
{
int ans;
scanf("%d",&t);
while (t--)
{
scanf("%d",&p);
ans=work(p);
printf("%d\n",ans);
}
}