题目链接

题目大意:求\(2^{2^{2^{2^{\ldots}}}}mod\;p\)

扩展欧拉定理


首先主角扩展欧拉定理:

\[a^b \equiv \begin{cases} a^{b\;mod\;\phi(p)} & gcd(a,p)=1 \\ a^b & gcd(a,b) \neq 1,b < \phi(p) \\ a^{b\;mod\;\phi(p) + \phi(p)} & gcd(a,b)\neq1,b \geq \phi(p)\end{cases} \quad mod \; p \]

然后既然用到了欧拉函数,我们可以用线性筛来求

首先如果\(p\)是质数,\(\phi(p)=p-1\)

如果有\(n\)的最小质因子\(p\),设\(n'= \frac{n}{p}\)\(p \mid n'\),那么有\(\phi(n)=p \times \phi(n')\) (如果\(n\)除掉一个质因子\(p\)\(n'\)还有质因子\(p\)那么\(n'\)的质因子集合就是\(n\)的质因子集合,结合欧拉函数的定义式即可)

\(n\)的质因子集合为\(\{p_1,p_2,p_3 \ldots, p_k\}\),定义\(\phi(n)=n \times \prod_{i=1}^{k}\frac{p_i-1}{p_i}\)(数学归纳法易证)

如果\(p \nmid n'\),那么\(n,n'\)互质,\(p\)又是质数,积性函数性质\(\phi(n)=\phi(p)\times\phi(n')\)

然后\(2^{2^{2^{2^{\ldots}}}}\)这玩意儿显然\(>\phi(p)\),不断递归求解,模数为\(1\)时返回\(0\)即可

注意\(\phi(1)=1\)

#include <cstdio>
using namespace std;
typedef long long ll;
const int maxm = 1e7 + 100;
int vis[maxm],pri[maxm],phi[maxm],pri_tot;
inline void eular(){
	phi[1] = 1;
	for(int i = 2;i < maxm;i++){
		if(!vis[i]){
			pri[++pri_tot] = i;
			phi[i] = i - 1;
		}
		for(int j = 1;j <= pri_tot;j++){
			if(1ll * i * pri[j] >= maxm)break;
			vis[i * pri[j]] = 1;
			if(i % pri[j])phi[i * pri[j]] = phi[i] * (pri[j] - 1);
			else{
				phi[i * pri[j]] = phi[i] * pri[j];
				break;
			}
		}
	}
}
inline ll qpow(ll a,ll b,ll mod){
	a %= mod;
	ll base = a,res = 1;
	while(b){
		if(b & 1)res = (res * base) % mod;
		base = (base * base) % mod;
		b >>= 1;
	}
	return res;
}
inline ll solve(ll mod){
	return mod == 1 ? 0 : qpow(2,solve(phi[mod]) + phi[mod],mod);
}
int t,p;
int main(){
	eular();
	scanf("%d",&t);
	while(t--)scanf("%d",&p),printf("%lld\n",solve(p));
	return 0;
}

相关文章:

  • 2021-07-16
  • 2021-10-04
  • 2021-10-26
  • 2021-12-21
  • 2022-03-03
  • 2021-10-25
  • 2021-05-08
猜你喜欢
  • 2021-12-26
  • 2022-12-23
相关资源
相似解决方案