AOJ 1141 - Dirichlet's Theorem on Arithmetic Progressions

やるだけ.

解法

10^6以下の素数が高々80,000個なので,小さい方から順にa+nd(nは非負整数)の形で表されるかを調べていき,n個目を出力すればいい.

コード

#include <cstdio>
#include <vector>

bool isNotPrime[1000001];
std::vector<int> primes;

int main(){
    primes.push_back(2);
    for(int i=4;i<=1000000;i+=2){
        isNotPrime[i] = true;
    }

    for(int i=3;i<=1000000;i+=2){
        if(!isNotPrime[i]){
            primes.push_back(i);
            for(int j=2*i;j<=1000000;j+=i){
                isNotPrime[j] = true;
            }
        }
    }
    
    int A, D, N;
    while(scanf("%d %d %d", &A, &D, &N), A || D || N){
        int t = 0;
        for(int p : primes){
            if(p < A){continue;}
            if((p-A) % D > 0){continue;}
            if(++t == N){printf("%d\n", p); break;}
        }
    }
}