先用一下欧拉素数筛,然后直接暴力枚举就行了。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define MAX 1000000+7
int prime[MAX];
bool is_prime[MAX+1];
int solve(int n) {
int p=0;
fill(is_prime,is_prime+MAX+1,true);
is_prime[0]=false;
is_prime[1]=false;
for(int i=2; i<=n; ++i) {
if(is_prime[i]) {
prime[p++]=i;
}
for(int j=0;j<p && i*prime[j]<=n;++j){
is_prime[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
return p;
}
int main(){
int a,d,n;
solve(MAX-1);
while(scanf("%d%d%d",&a,&d,&n)!=EOF){
if(a==0&&d==0&&n==0){
break;
}
int tt=0;
for(int i=a; ;i+=d){
if(is_prime[i]){
tt++;
}
if(tt==n){
cout<<i<<endl;
break;
}
}
}
return 0;
}

本文介绍了一种结合欧拉素数筛与暴力枚举算法的高效求解方法,通过预处理素数并针对特定输入进行快速查找,实现对一系列数学问题的有效解决。算法首先使用欧拉筛法生成素数表,随后利用生成的素数表对给定范围内的数进行暴力枚举,判断其是否为素数。
891





