挑战程序竞赛系列(44):4.1计数 欧拉函数
2017-09-01 08:52
423 查看
挑战程序竞赛系列(44):4.1计数 欧拉函数
详细代码可以fork下Github上leetcode项目,不定期更新。练习题如下:
POJ 2407: Relatives
POJ 2407: Relatives
条件解析:a=xz and b=xy,不存在x>1,z>0,y>0
说白了,两两互素,比如 a = 4, b = 9
代码如下:
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/201709/P2407.txt"; public static void main(String[] args) throws IOException { new Main().run(); } static final int MAX_N = 10000 + 16; int[] euler = new int[MAX_N]; public void euler_phi(){ 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); } } } } public int phi(int n){ int res = n; for (int i = 2; i < n / i; ++i){ if (n % i == 0){ res = res / i * (i - 1); for (; n % i == 0; n /= i); } } if (n != 1){ res = res / n * (n - 1); } return res; } void solve() { euler_phi(); while (true){ int n = ni(); if (n == 0) break; if (n < MAX_N) out.println(euler ); else out.println(phi(n)); } } 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); } } }
啧啧,睡了一觉回来,跑不快了。。。
相关文章推荐
- 挑战程序竞赛系列(47):4.1 计数 二项式取模
- 挑战程序竞赛系列(45):4.1Polya 计数定理(1)
- 挑战程序竞赛系列(46):4.1Polya 计数定理(2)
- 挑战程序竞赛系列(41):4.1中国剩余定理
- 挑战程序竞赛系列(43):4.1矩阵 高斯消元
- 挑战程序竞赛系列(31):4.5剪枝
- 挑战程序竞赛系列(76):4.3强连通分量分解(3)
- 挑战程序竞赛系列(33):POJ 2991 Crane
- 挑战程序竞赛系列(23):3.2折半枚举
- 挑战程序竞赛系列(56):4.4 双端队列(3)
- 挑战程序竞赛系列(5):2.1广度优先搜索
- 挑战程序竞赛系列(32):4.5 A*与IDA*
- 挑战程序竞赛系列(15):2.6快速幂运算
- 挑战程序竞赛系列(91):3.6凸包(2)
- 挑战程序竞赛系列(18):3.1查找第k大的值
- 挑战程序竞赛系列(25):3.5最大权闭合图
- 挑战程序竞赛系列(26):3.5二分图匹配(1)
- 挑战程序竞赛系列(95):3.6数值积分(1)
- 挑战程序竞赛系列(38):4.1模运算的世界(1)
- 挑战程序竞赛系列(40):4.1模运算的世界(3)