HDU 5728 - PowMod
2016-07-24 22:41
337 查看
HDU 5728 - PowMod
题意:
定义: k = ∑(i=1,m) φ(i∗n) mod 1000000007
给出: n,m,p ,且 n 无平方因子
求: ans= k^(k^(k...k)) mod p (k有无限个)
分析:
欧拉函数 + 指数循环节
第一部分 求出 k.
定理: 1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.
应用:
∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) ,可自行推导
第二部分
应用指数循环节化无限为有限,具体实现为递归操作
指数循环节: A^x = A^(x % φ(C) + φ(C)) (mod C) (x >= φ(C))
题意:
定义: k = ∑(i=1,m) φ(i∗n) mod 1000000007
给出: n,m,p ,且 n 无平方因子
求: ans= k^(k^(k...k)) mod p (k有无限个)
分析:
欧拉函数 + 指数循环节
第一部分 求出 k.
定理: 1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.
应用:
∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) ,可自行推导
第二部分
应用指数循环节化无限为有限,具体实现为递归操作
指数循环节: A^x = A^(x % φ(C) + φ(C)) (mod C) (x >= φ(C))
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MOD= 1000000007; const int MAXN=1e7; int euler[MAXN+5]; long long sum[MAXN+5]; long long k,n,m,p; void GetEuler() { memset(euler,0,sizeof(euler)); euler[1]=1; for(int i = 2;i <= MAXN;i++) if(!euler[i]) for(int j = i;j <= MAXN;j += i) { if(!euler[j]) euler[j]=j; euler[j] = euler[j] / i * (i-1); } sum[1]=1; for(int i = 2;i <=MAXN; i++) sum[i] = (sum[i-1] + euler[i]) % MOD; } long long Get_K(long long n,long long m) { if(m==0) return 0; if(m==1) return euler ; if(n==1) return sum[m]; if(euler ==n-1) return (euler *Get_K(1,m)%MOD + Get_K(n,m/n))%MOD; for(int i=2;i<MAXN;i++) if(n%i==0) return (euler[i] * Get_K(n/i,m)%MOD + Get_K(n,m/i) ) % MOD; } long long PowMod(long long a,long long b, long long mod) { long long r = 1; while(b) { if(b&1) r = (r*a)%mod; a= (a*a)%mod; b>>=1; } return r; } long long Cal(long long k, long long p) { if( p == 2) return k&1;//mod φ(p) return PowMod(k,Cal(k,euler[p])+euler[p],p);//递归的计算ans,递归出口为φ(p)=1 } int main() { GetEuler(); while(~scanf("%lld%lld%lld",&n,&m,&p)) { k = Get_K(n,m); printf("%lld\n",Cal(k,p)); } }
/* 欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。 例如euler(8)=4,因为1,3,5,7均和8互质。 通式: 对于一个正整数N的素数幂分解 N = (P1^q1) * (P2^q2) * ...* (Pn^qn). φ(1) = 1. φ(N) = N * (1-1/P1) * (1-1/P2) *...* (1-1/Pn). 定理: 1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1. 2.一个数的所有质因子之和是 euler(n)*n/2. 3.若n是素数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质. 特殊性质: 1.当n为奇数时,φ(2n) = φ(n). 2.对于质数p,φ(p) = p - 1 3.除了N=2,φ(N)都是偶数. 指数循环节: A^x = A^(x % φ(C) + φ(C)) (mod C) (x >= φ(C)) 定理1 应用: ∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) */
相关文章推荐
- 【HDU 杭电 1061】 Rightmost Digit
- camera isp
- Hibernate-----cascade VS inverse
- SAS 9.4 SID 更新
- Build a Material Design App with the Android Design Support Library
- java编程---2、用数组编写简易的学生管理系统
- HTML——表单标记
- KVO & KVC 比较 - KVC
- 11、触发器
- 使用Markdown编辑器写博客
- php的非阻塞套接字socket
- 2016大学生电子设计竞赛赛题分析
- 2016年全面前端面试题总结
- ACdream1157 Segments(CDQ分治 + 线段树)
- 10.程序包
- LeetCode--77_Combinations
- Issure: LookupError: unknown encoding: cp65001
- 如何把项目放到GitHub上
- Spring Data JPA 学习笔记(一)
- Linux驱动开发必看