挑战程序竞赛系列(39):4.1模运算的世界(2)
来源:互联网 发布:java研发工程师南昌 编辑:程序博客网 时间:2024/06/05 20:12
挑战程序竞赛系列(39):4.1模运算的世界(2)
详细代码可以fork下Github上leetcode项目,不定期更新。
练习题如下:
- POJ 1284: Primitive Roots
POJ 1284: Primitive Roots
欧拉函数这东西我只知道一个定义:
欧拉函数的值等于不超过m并且和m互素的个数。
表达式如下:
其中
首先,如果m是素数,可以直接得到
有了这两条定理,我们只需要证明欧拉函数满足乘性函数即可,具体可以参考《初等数论及其应用》P175页。
此题,则用到了《初等》P249,定理9.5
定理:如果p有原根,则它恰有φ(φ(p))个不同的原根(无论p是否为素数都适用)
p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根
欧拉函数的实现参考《挑战》P292,经历了三个版本。
代码如下:
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.StringTokenizer;public class Main{ String INPUT = "./data/judge/201708/P1284.txt"; public static void main(String[] args) throws IOException { new Main().run(); } void solve() { while (more()){ int P = ni(); out.println(euler_phi1(P - 1)); } }// public int euler_phi(int n){ // n * (pi - 1) / pi = n / pi * (pi - 1)// int res = n;// while (n > 1){// for (int i = 2; i <= n; ++i){// if (n % i == 0){// res = res / i * (i - 1);// while (n % i == 0){// n /= i;// }// }// }// }// return res;// } public int euler_phi1(int n){ // n * (pi - 1) / pi = n / pi * (pi - 1) int res = n; for (int i = 2; i <= n / i; ++i){ if (n % i == 0){ res = res / i * (i - 1); while (n % i == 0) n /= i; } } if (n != 1) res = res / n * (n - 1); return res; } int MAX_N = 65536 + 16; int[] euler; public void euler_phi2(){ //如果是素数 欧拉函数为 p - 1 euler = new int[MAX_N]; for (int i = 0; i < MAX_N; ++i) euler[i] = i; for (int i = 2; i < MAX_N; ++i){ if (euler[i] == i){ for (int j = i; j < MAX_N; j += i){ euler[j] = euler[j] / i * (i - 1); // } } } } FastScanner in; PrintWriter out; void run() throws IOException { boolean oj; try { oj = ! System.getProperty("user.dir").equals("F:\\java_workspace\\leetcode"); } catch (Exception e) { oj = System.getProperty("ONLINE_JUDGE") != null; } InputStream is = oj ? System.in : new FileInputStream(new File(INPUT)); in = new FastScanner(is); out = new PrintWriter(System.out); long s = System.currentTimeMillis(); solve(); out.flush(); if (!oj){ System.out.println("[" + (System.currentTimeMillis() - s) + "ms]"); } } public boolean more(){ return in.hasNext(); } public int ni(){ return in.nextInt(); } public long nl(){ return in.nextLong(); } public double nd(){ return in.nextDouble(); } public String ns(){ return in.nextString(); } public char nc(){ return in.nextChar(); } class FastScanner { BufferedReader br; StringTokenizer st; boolean hasNext; public FastScanner(InputStream is) throws IOException { br = new BufferedReader(new InputStreamReader(is)); hasNext = true; } public String nextToken() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { hasNext = false; return "##"; } } return st.nextToken(); } String next = null; public boolean hasNext(){ next = nextToken(); return hasNext; } public int nextInt() { if (next == null){ hasNext(); } String more = next; next = null; return Integer.parseInt(more); } public long nextLong() { if (next == null){ hasNext(); } String more = next; next = null; return Long.parseLong(more); } public double nextDouble() { if (next == null){ hasNext(); } String more = next; next = null; return Double.parseDouble(more); } public String nextString(){ if (next == null){ hasNext(); } String more = next; next = null; return more; } public char nextChar(){ if (next == null){ hasNext(); } String more = next; next = null; return more.charAt(0); } }}
打表快点,但对内存要求高。
阅读全文
0 0
- 挑战程序竞赛系列(39):4.1模运算的世界(2)
- 挑战程序竞赛系列(38):4.1模运算的世界(1)
- 挑战程序竞赛系列(40):4.1模运算的世界(3)
- 挑战程序竞赛系列(42):4.1模运算的世界(4)
- 挑战程序竞赛系列(15):2.6快速幂运算
- 挑战程序竞赛系列(30):3.4矩阵的幂
- 挑战程序竞赛系列(41):4.1中国剩余定理
- 挑战程序竞赛系列(43):4.1矩阵 高斯消元
- 挑战程序竞赛系列(82):4.3 LCA(2)
- 挑战程序竞赛系列(59):4.6树上的分治法(2)
- 挑战程序竞赛系列(62):4.6平面上的分治法(2)
- 挑战程序竞赛系列(64):4.7字符串上的动态规划(2)
- 挑战程序竞赛系列(47):4.1 计数 二项式取模
- 挑战程序竞赛系列(46):4.1Polya 计数定理(2)
- 挑战程序竞赛系列(81):4.3 LCA(1)
- 挑战程序竞赛系列(1):2.3动态规划
- 挑战程序竞赛系列(4):2.1深度优先搜索
- 挑战程序竞赛系列(5):2.1广度优先搜索
- SDWebImage 的使用
- redis集群动态增加或者删除节点
- 547. Friend Circles(并查集)
- 【51Nod1353】树
- redis编译报致命错误:jemalloc/jemalloc.h:没有那个文件或目录
- 挑战程序竞赛系列(39):4.1模运算的世界(2)
- 博弈论水题列表
- Codeforces 18D Seller Bob (贪心)
- Springboot中使用定时器
- 常用表单元素
- 基于RNN的中文古诗词生成神经网络实现
- Linux内核高性能优化【生产环境实例】
- 1730数字三角形问题(三角形内路径最大)
- OC : NSError (错误)