P4139 上帝与集合的正确用法

思路:扩展欧拉定理

提交:\(1\)

题解:

首先简介扩展欧拉定理:
\(b>=\varphi(p)\)时,\(a^b\equiv a^{b\%\varphi(p)+\varphi(p)} \mod p\)
这样我们可以递归去算这个式子,直到\(p==1\),因为\(2^{2^{2^\cdots}}\)永远是无穷大的。

代码:

#include<cstdio>
#include<iostream>
#define ll long long
#define R register ll
using namespace std;
namespace Luitaryi {
template<class I> inline I g(I& x) { x=0;
    register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
    do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
} const int N=1e7+10;
int T,x,cnt,p[N>>1],phi[N];
bool v[N];
inline void PRE() { phi[1]=1;
    for(register int i=2;i<=N-10;++i) {
        if(!v[i]) p[++cnt]=i,phi[i]=i-1;
        for(register int j=1;j<=cnt&&i*p[j]<=N-10;++j) {
            v[i*p[j]]=true;
            if(i%p[j]==0) {
                phi[i*p[j]]=phi[i]*p[j]; break;
            } phi[i*p[j]]=phi[i]*(p[j]-1);
        }
    } 
} 
inline int qpow(int p,int M) { R a=2,ret=1;
    for(;p;p>>=1,(a*=a)%=M) if(p&1) (ret*=a)%=M; return ret;
}
inline int calc(int x) {
    if(x==1) return 0;
    return qpow(phi[x]+calc(phi[x]),x);
}
inline void main() {
    PRE(); g(T); while(T--) {
        g(x); printf("%d\n",calc(x));
    }
}
} signed main() {Luitaryi::main(); return 0;}

2019.08.23
77

转载于:https://www.cnblogs.com/Jackpei/p/11401388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值