bool isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    if (n <= 3)  {
        return true;
    }

    if (n % 2 == 0 || n % 3 == 0) {
        return false;
    }

    for (int i = 5; i * i <= n; i = i + 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

class PrimeNumberGenerator {
 public:
    explicit PrimeNumberGenerator(int start) : current_number(start) {}
    int GetNextPrime() {
        if (current_number <= 1) {
            return 2;
        }

        int current_prime = current_number;
        bool prime_is_founded = false;

        while (!prime_is_founded) {
            current_prime++;
            if (isPrime(current_prime)) {
                prime_is_founded = true;
            }
        }
        current_number = current_prime;
        return current_prime;
    }

 private:
    int current_number;
};