POJ 刷题系列:3006. Dirichlet's Theorem on Arithmetic Progressions
来源:互联网 发布:如何搜索二次元软件 编辑:程序博客网 时间:2024/06/03 17:22
POJ 刷题系列:3006. Dirichlet’s Theorem on Arithmetic Progressions
传送门:3006. Dirichlet’s Theorem on Arithmetic Progressions
题意:
给出一个递增序列,求该递增序列中第n个素数。
思路:
这些水题怎么都跟素数有关。。。实际上给定初项a和公差d,以及可能的素数,能判断该素数是否在这个递增数列中。
if (prime - a) % d == 0 说明是递增数列中的一个元素所以,只要遇到素数属于递增数列,计数,直到第n个就输出答案。
代码如下:
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.Arrays;import java.util.Map;import java.util.StringTokenizer;public class Main{ String INPUT = "./data/judge/201712/P3006.txt"; public static void main(String[] args) throws IOException { new Main().run(); } static final int MAX_N = 1000000 + 16; boolean[] isPrime; int[] primes; int tot; void seive() { isPrime = new boolean[MAX_N]; primes = new int[MAX_N]; Arrays.fill(isPrime, true); for (int i = 2; i < MAX_N; ++i) { if (isPrime[i]) { primes[tot++] = i; for (int j = 2 * i; j < MAX_N; j += i) { isPrime[j] = false; } } } } int solve(int a, int d, int n) { int ans = 0; for (int j = 0, i = 0; j < n; ++j, ++i) { while (primes[i] - a < 0 || (primes[i] - a) % d != 0) { i ++; } ans = primes[i]; } return ans; } void read() { seive(); while (true) { int a = ni(); int d = ni(); int n = ni(); if (a + d + n == 0) break; out.println(solve(a, d, n)); } } FastScanner in; PrintWriter out; void run() throws IOException { boolean oj; try { oj = ! System.getProperty("user.dir").equals("F:\\oxygen_workspace\\Algorithm"); } 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(); read(); 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); } } static class D{ public static void pp(int[][] board, int row, int col) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { sb.append(board[i][j] + (j + 1 == col ? "\n" : " ")); } } System.out.println(sb.toString()); } public static void pp(char[][] board, int row, int col) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { sb.append(board[i][j] + (j + 1 == col ? "\n" : " ")); } } System.out.println(sb.toString()); } } static class ArrayUtils { public static void fill(int[][] f, int value) { for (int i = 0; i < f.length; ++i) { Arrays.fill(f[i], value); } } public static void fill(int[][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } public static void fill(int[][][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } } static class Num{ public static <K> void inc(Map<K, Integer> mem, K k) { if (!mem.containsKey(k)) mem.put(k, 0); mem.put(k, mem.get(k) + 1); } }}
阅读全文
0 0
- POJ 刷题系列:3006. Dirichlet's Theorem on Arithmetic Progressions
- 3006. Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions(素数表)
- poj 3006 Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions 素数
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions
- poj 3006 Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions
- POJ -----3006 Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions
- poj 3006 Dirichlet's Theorem on Arithmetic Progressions 【素数筛】
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 - Dirichlet's Theorem on Arithmetic Progressions
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions
- Dirichlet's Theorem on Arithmetic Progressions (poj 3009 水题)
- 【暴力】POJ-3006 Dirichlet's Theorem on Arithmetic Progressions
- Poj 3006 Dirichlet's Theorem on Arithmetic Progressions
- 17ANoldbach problem
- Python基础-高阶函数-Higher-order function
- 查找算法
- 省选专练APIO2009抢掠计划
- Unity3D实用脚本(二)—— 检查场景中用到的资源
- POJ 刷题系列:3006. Dirichlet's Theorem on Arithmetic Progressions
- 欢迎使用CSDN-markdown编辑器
- css3
- java常用的框架介绍
- 十九大总结
- Tcp/Ip理论基础
- Window系统生成CXF Webservice客户端
- 两种网络请求
- 多线程之模拟多人过山洞