本题我采用的基本是属于枚举的算法,感觉时间复杂度有点高,但是跑起来能过,不知道是否存在更优的算法?有想法可以在评论区讨论一下。
关于题目背景中的Dirichlet Theorem,可以看这个链接Dirichlet 定理 - 知乎 (zhihu.com)
本人的数学水平不高,无法看懂这个定理的证明,但我大胆猜测这个定理的证明中可能蕴含这个数列的更多性质,利用这些性质,或许可以找到一个更优的算法。
#include <iostream>
using namespace std;
int isprime(int a)
{
int i;
int k=0;
if(a==0||a==1)return 1;
if(a==2)return 0;
else {
for(i=2;i<=(a/2)+1;i++){
if(a%i==0) k=1;
}
return k;
}
}
int main()
{
int a,d,n;
int i,j,r=0;
int ans[1000];
do{
i=0;
j=0;
cin>>a>>d>>n;
do{
if(isprime(a+i*d)==0)j++;
i++;
}while(j<n);
ans[r]=a+(i-1)*d;
r++;
}while(a!=0||d!=0||n!=0);
cout<<ans[0];
for(i=1;i<=r-2;i++){
cout<<endl<<ans[i];
}
return 0;
}