博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求幂塔函数
阅读量:4332 次
发布时间:2019-06-06

本文共 1165 字,大约阅读时间需要 3 分钟。

算出幂塔函数\(a^a\)共b个a乘幂的结果模m的值。

求a^(a^(a^(a^(a^...)))),a的a次方的a次方的a次方..%m

我只能想到欧拉降幂递归求解,但是要优化,不然会超时(下面那个优化我也没看懂mod的函数为什么要用在快速幂和递归return里面

在这个大佬的博客看到的

#include 
typedef long long LL;LL phi[1000010];LL maxn = 1000005;void phi_table() { phi[0] = 0, phi[1] = 1; for(LL i = 2; i < maxn; ++i) phi[i] = i; for(LL i = 2; i < maxn; ++i) { if(phi[i] == i) { for(LL j = i; j < maxn; j += i) phi[j] = phi[j] / i * (i - 1); } }}LL mod(LL a, LL b) { return a < b ? a : a % b + b;}LL pow_mod(LL a, LL b, LL p) { LL ret = 1; while(b) { if(b & 1) ret = mod(ret * a, p); a = mod(a * a, p); b >>= 1; } return ret;}LL euler(LL a, LL b, LL c) { if(b == 1 || c == 1) return mod(a, c); return pow_mod(a, euler(a, b - 1, phi[c]), c);}int main() { phi_table(); int t; LL a, b, m; scanf("%d", &t); while(t--) { scanf("%lld %lld %lld", &a, &b, &m); if(b == 0 || a == 1) printf("%lld\n", 1ll % m); else { LL ans = euler(a, b, m); printf("%d\n", ans % m); } } return 0;}

转载于:https://www.cnblogs.com/fanshhh/p/11449275.html

你可能感兴趣的文章
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>
xml解析
查看>>
centos安装vim
查看>>
linux工作调度(计划任务)
查看>>
hdu--1698 Just a Hook(线段树+区间更新+懒惰标记)
查看>>
Python学习笔记-EXCEL操作
查看>>
输出保留12位小数的浮点数
查看>>
LnTbtbKLyv
查看>>
springboot ---> spring ioc 注册流程 源码解析 this.prepareContext 部分
查看>>
Java基础随笔
查看>>
图的存储结构
查看>>
图的遍历
查看>>
最小生成树的基本算法
查看>>
MySQL基础操作
查看>>
cf 1004 D Sonya and Matrix
查看>>
求幂塔函数
查看>>
机器学习常用性能度量中的Accuracy、Precision、Recall、ROC、F score等都是些什么东西?...
查看>>
目标检测中常提到的IoU和mAP究竟是什么?
查看>>
eclipse运行mapreduce的wordcount
查看>>
linux命令帮助 man bash
查看>>