【数论 费马小定理】P4139 上帝与集合的正确用法

 

 

 

 直接递归求解

先用线性筛,筛一下phi

 

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e7+5;
int phi[maxn],prime[maxn],tot;
void init()
{
    phi[1]=1;
    for(int i=2;i<=maxn;i++)
    {
        if(!phi[i])
        {
            prime[++tot]=i;
            phi[i]=i-1;    
        }
        for(int j=1;j<=tot;j++)
        {
            if(prime[j]*i>maxn) break;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            } 
            else phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}
int qpow(int a,int b,int mod)
{
    int res=1;
    while(b)
    {
        if(b&1) res=(res*a)%mod;
        b>>=1;
        a=(a*a)%mod;
    }
    return res;
}
int calc(int x)
{
    if(x==1) return 0;
    return qpow(2,calc(phi[x])+phi[x],x);
}
signed main()
{    
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    init();
    int t,p; scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&p);
        printf("%lld\n",calc(p));
    }    
    return 0;
}

 

posted @ 2020-11-25 11:17  andyc_03  阅读(65)  评论(0编辑  收藏  举报