欧拉降幂

# 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;
}

posted @ 2022-02-26 23:17  fengzlj  阅读(41)  评论(0)    收藏  举报