Dirichlet's Theorem on Arithmetic Progressions SDUT 3006
2015-08-24 17:05
417 查看
Description
If a and d are relatively prime positive integers, the arithmetic sequence beginning with
a and increasing by d, i.e., a, a + d,
a + 2d, a + 3d, a + 4d, ..., contains infinitely many prime numbers. This fact is known as Dirichlet's Theorem on Arithmetic Progressions, which had been conjectured by Johann Carl Friedrich Gauss (1777
- 1855) and was proved by Johann Peter Gustav Lejeune Dirichlet (1805 - 1859) in 1837.
For example, the arithmetic sequence beginning with 2 and increasing by 3, i.e.,
2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, ... ,
contains infinitely many prime numbers
2, 5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, ... .
Your mission, should you decide to accept it, is to write a program to find the
nth prime number in this arithmetic sequence for given positive integers
a, d, and n.
Input
The input is a sequence of datasets. A dataset is a line containing three positive integers
a, d, and n separated by a space. a and d are relatively prime. You may assume
a <= 9307, d <= 346, and n <= 210.
The end of the input is indicated by a line containing three zeros separated by a space. It is not a dataset.
Output
The output should be composed of as many lines as the number of the input datasets. Each line should contain a single integer and should never contain extra characters.
The output integer corresponding to a dataset a, d, n should be the
nth prime number among those contained in the arithmetic sequence beginning with
a and increasing by d.
FYI, it is known that the result is always less than 106 (one million) under this input condition.
Sample Input
Sample Output
题意就是a为起点,d为公差,形成递增序列,从序列中找到第n个素数输出。范围为1000000,直接打表就可以了。
If a and d are relatively prime positive integers, the arithmetic sequence beginning with
a and increasing by d, i.e., a, a + d,
a + 2d, a + 3d, a + 4d, ..., contains infinitely many prime numbers. This fact is known as Dirichlet's Theorem on Arithmetic Progressions, which had been conjectured by Johann Carl Friedrich Gauss (1777
- 1855) and was proved by Johann Peter Gustav Lejeune Dirichlet (1805 - 1859) in 1837.
For example, the arithmetic sequence beginning with 2 and increasing by 3, i.e.,
2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, ... ,
contains infinitely many prime numbers
2, 5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, ... .
Your mission, should you decide to accept it, is to write a program to find the
nth prime number in this arithmetic sequence for given positive integers
a, d, and n.
Input
The input is a sequence of datasets. A dataset is a line containing three positive integers
a, d, and n separated by a space. a and d are relatively prime. You may assume
a <= 9307, d <= 346, and n <= 210.
The end of the input is indicated by a line containing three zeros separated by a space. It is not a dataset.
Output
The output should be composed of as many lines as the number of the input datasets. Each line should contain a single integer and should never contain extra characters.
The output integer corresponding to a dataset a, d, n should be the
nth prime number among those contained in the arithmetic sequence beginning with
a and increasing by d.
FYI, it is known that the result is always less than 106 (one million) under this input condition.
Sample Input
367 186 151 179 10 203 271 37 39 103 230 1 27 104 185 253 50 85 1 1 1 9075 337 210 307 24 79 331 221 177 259 170 40 269 58 102 0 0 0
Sample Output
92809 6709 12037 103 93523 14503 2 899429 5107 412717 22699 25673
题意就是a为起点,d为公差,形成递增序列,从序列中找到第n个素数输出。范围为1000000,直接打表就可以了。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define N 1000000 bool flog ; using namespace std; int main() { int a,d,n; memset(flog,false,sizeof(flog)); flog[0]=true; flog[1]=true; for(int i=2; i<=N/2; i++)//欧拉筛法 { if(flog[i]==false) for(int j=i+i; j<N; j+=i) { flog[j]=true; } } while(~scanf("%d%d%d",&a,&d,&n)) { if(a==0&&d==0&&n==0)break; int i; for(i=a; n!=0; i+=d) { if(flog[i]==false) { n--; } } printf("%d\n",i-d); } return 0; }
相关文章推荐
- 使用哪种重载的问题
- 哈希冲突
- 程序员的三年创业之路
- 一种让超大banner图片不拉伸、全屏宽、居中显示的方法
- Java(Android)线程池[转]
- iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前
- Ant的使用方法
- Introduction to Java Programming编程题7.6<两个矩阵相乘>
- POJ1979 DFS
- Opencv用鼠标绘制椭圆
- Uvalive6439(Pasti Pas!)
- MongoDB count distinct group by JavaAPI查询
- bzoj4004[JLOI2015]装备购买
- MYSQL的常用命令和增删改查语句和数据类型
- interrupt的问题
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
- Nginx 与Tomcat 实现动静态分离、负载均衡
- swt中setToolTipText()失效问题和setToolTipText()部分测试
- Android 打造形形色色的进度条 实现可以如此简单
- CSU_1508_地图的四着色