题目链接:http://poj.org/problem?id=3006
题目大意:设一个等差数列,首元素为a,公差为b
现在要求输入a,b,n ,要求找出属于该等差数列中的第n个素数并输出
思路:先打表把素数打出来,然后就是一道水题了
///2014.7.16
///poj3006
//Accepted 1516K 63MS C++ 1333B 2014-07-16 21:54:14
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
/*===================================================*\
欧拉筛法 素数打表,该函数执行后
prim[]数组中存入[2,N]区间内的所有素数(从prim[0]开始存入)
isPrime[i] 表示整数 i 是否为素数
函数返回[2,N]之间的素数的个数
\*===================================================*/
const int N = 1000000;
bool isPrime[N+10];
int prim[80000]; //要注意保证pirm[]数组足够存储[2,N]之间的素数
int prime(){
int num = 0;
memset(isPrime,true,sizeof(isPrime));
isPrime[0] = isPrime[1] = false;
for(int i=2 ; i<=N ; i++){
if( isPrime[i] ) prim[num++] = i;
for(int j=0 ; j<num ; j++){
if( i*prim[j]>N ) break;
isPrime[ i*prim[j] ] = false;
if( i%prim[j] == 0 ) break;
}
}
return num;
}
int a,d,n;
int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);
prime();
while( scanf("%d %d %d",&a,&d,&n) && !(!a&&!d&&!n) ){
int i;
for(i=0 ; i<n ; ){
if( isPrime[a] ){
i++;
a += d;
continue;
}
else{
while( !isPrime[a] )
a += d;
}
}
cout<<a-d<<endl;
}
return 0;
}