[2016ACM多校] HDU5728 数论 欧拉函数及其定理
来源:互联网 发布:淘宝公司简介怎么写 编辑:程序博客网 时间:2024/05/22 15:03
题意
给n,m,p,定义k=sigma(1~m,phi[i*n]),计算k^k^k^……^k。phi是欧拉函数,n无平方因数,最后有无限个k
思路
参考http://blog.csdn.net/wust_zzwh/article/details/51966450,其中给了详细的推理过程。贴图附上
这里补充说明一下phi(i*p*n)=p*phi(i*n)这个公式,这里p已经是n的因数,这里是讨论当p也是i的因数的情况,那么i*n中含有至少2个p。假设有r个p,那么由欧拉函数定义phi[i*n]=phi[i*n/p^r](p^r-p^(r-1))=phi[i*n/p^r](p^(r-1)-p(r-2))*p=phi[i/p*n]*p。
最后又无限个k,引入欧拉定理a^phi[n]=1(mod n),那么也就是说每kphi(k^k^k^…)%p=1。那就可以用循环节递归计算指数的时候不断用欧拉函数减小mod的值直到0,这样就成为有限个了,即a^b%p=a^(b%p)%p.
AC代码 C
#include <stdio.h>#define MAXP 10000005#define MOD 1000000007bool vis[MAXP]; //筛法表int phi[MAXP]; //欧拉函数int sum_phi[MAXP]; //欧拉函数前缀和 int prime[MAXP]; //素数表int sump; //素数个数void get_phi() //筛法求欧拉函数 { //memset(vis, false, sizeof vis); phi[1] = 1; int i, j; for(i=2, sump=0; i<MAXP; i++) { if(!vis[i]) { phi[i] = i - 1; prime[sump++] = i; } for(j=0; j<sump; j++) { if(i * prime[j] > MAXP) break; vis[i * prime[j]] = true; if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1); else { phi[i * prime[j]] = phi[i] * prime[j]; break; } } } for(i=sum_phi[0]=0; i<MAXP; i++) sum_phi[i] = (sum_phi[i-1] + phi[i]) % MOD;}int get_k(int n, int m){ if(m < 1) return 0; if(m == 1) return phi[n]; if(n == 1) return sum_phi[m]; for(int i=0; i<sump; i++) if(n % prime[i] == 0) return ((long long)phi[prime[i]] * get_k(n / prime[i], m) % MOD + get_k(n, m / prime[i])) % MOD;}int quick_pow(int a, int n, int mod){ int res = 1; do { if(n & 1) res = (long long)res * a % mod; a = (long long)a * a % mod; }while(n >>= 1); return res;}int get_kk(int k, int p){ if(p == 1) return 0; return quick_pow(k, get_kk(k, phi[p]) + phi[p], p);}int main(){ get_phi(); int n, m, p; while(scanf("%d%d%d", &n, &m, &p) > 0) printf("%d\n", get_kk(get_k(n, m), p)); return 0;}
0 0
- [2016ACM多校] HDU5728 数论 欧拉函数及其定理
- 【HDU5728 2016 Multi-University Training Contest 1F】【数论+迭代 欧拉函数线性筛+积性递归】PowMod 欧拉函数积性性质+无穷幂迭代
- 【数论】欧拉定理
- 数论的欧拉定理证明&欧拉函数公式
- 数论的欧拉定理证明 & 欧拉函数公式
- ACM常用数论之欧拉函数
- 2016多校训练一 PowMod,hdu5728(欧拉函数+指数循环节)
- HDU5728 2016 Multi-University Training Contest 1 (递归+欧拉函数)
- 【结论】【数论】欧拉定理
- 数论基础 (费马小定理/扩展欧几里得/欧拉函数)
- 【HDU5728 PowMod】【欧拉函数+指数循环节】【欧拉函数积性性质+无穷幂迭代】
- ACM第一课---数论之欧拉函数
- ACM第一课---数论之欧拉函数
- ACM:数论专题(5)——欧拉函数
- ACM: 扩展欧几里德+欧拉函数 数论…
- 数论 约数定理 约数和定理 欧拉定理
- 数论的欧拉定理证明 &amp; 欧拉函数公式
- 数论的欧拉定理证明 & 欧拉函数公式
- Linux内存中的Cache真的能被回收么?
- oracle用户状态
- HDU 1201 18岁生日
- 使用ActionBar缺少主题时jar包中抛类型转换异常
- 设计
- [2016ACM多校] HDU5728 数论 欧拉函数及其定理
- 递归方法 使用sql查询生成开始到结束日期之间的所有日期
- hdu-1072 Nightmare(DFS+剪枝)
- jquery load方法用法详解
- 如何查询Oracle中所有用户信息
- B-tree/B+tree/B*tree
- STL中的常用的vector,map,set,Sort用法
- iOS8.0图片PhotoKit笔记
- 薄荷Toolbar(ActionBar)的适配方案 (翻译)