#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int ha[200001]; bool isprime[200001]; int main(void) { cin.tie(0); ios::sync_with_stdio(false); int K, N; cin >> K; cin >> N; for (int i = 1; i < 10; i++) { ha[i] = i; } for (int i = 10; i <= N; i++) { int val = i; int sum = 0; while (val > 0) { sum += (val % 10); val /= 10; } ha[i] = ha[sum]; } vector prime; memset(isprime, true, sizeof(isprime)); isprime[1] = false; for (int i = 2; i <= 200000; i++) { if (isprime[i]) { if (i >= K && i <= N) { prime.push_back(i); } for (int j = 2 * i; j <= 200000; j += i) { isprime[j] = false; } } } //슬라이딩 윈도우 int res = N; int val = 0; set S; int cnt = 0; int L = 0; int R = 0; int n = prime.size(); while (1) { //cout << L << ' ' << R << ' ' << res << ' ' << val << ' ' << cnt << '\n'; if (L >= n && R >= n) { break; } if (R < n) { if (S.find(ha[prime[R]]) == S.end()) { cnt++; S.insert(ha[prime[R]]); R++; } else { if (val <= cnt) { val = cnt; res = prime[L]; } S.erase(ha[prime[L]]); L++; cnt--; } } else { if (val <= cnt) { val = cnt; res = prime[L]; } S.erase(ha[prime[L]]); L++; cnt--; } } cout << res << '\n'; return 0; }