https://www.lydsy.com/JudgeOnline/problem.php?id=3884
题意
扩展欧拉定理
扩展欧拉定理只需要知道这个式子:
对a与m互质性没有要求时,经常用到后两个公式降幂。
思路
设函数
因为指数上是无限个2,肯定大于phi[p],则有
看出可以用递归来写
phi[p]很快会变为1,此时则为0,后面就没有了,这就是递归出口
代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=1e7+2;
int su[680000],phi[maxn];
bool prime[maxn];
void init()
{
int cnt=0;
prime[0]=prime[1]=1;//不是素数
for(int i=2; i<maxn; i++)
{
if(!prime[i])
su[cnt++]=i,phi[i]=i-1;
for(int j=0; j<cnt&&su[j]*i<maxn; j++)
{
prime[su[j]*i]=1;
if(i%su[j]==0)
{
phi[i*su[j]]=phi[i]*su[j];
break;
}
phi[i*su[j]]=phi[i]*(su[j]-1);
}
}
}
ll qm(ll a,ll b,ll m)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%m;
a=a*a%m;
b>>=1;
}
return ans;
}
ll f(ll p)
{
if(p==1)
return 0;
return qm(2,f(phi[p])+phi[p],p);
}
int main()
{
int t;
init();
ll p;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&p);
ll ans=f(p);
printf("%lld\n",ans);
}
return 0;
}