#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INF 1000000000 using namespace std; typedef long long ll; const int MAXN = 400200; bool isPrime[MAXN]; vector prime; bool flag[10]; int getHash(int n) { if (n < 10) return n; string s = to_string(n); int ret = 0; for (int i = 0; i < s.size(); i++) { ret += s[i] - '0'; } return getHash(ret); } void createPrime() { for (int i = 2; i < MAXN; i++) isPrime[i] = true; for (int i = 2; i * i < MAXN; i++) { if (isPrime[i]) { for (int j = 2; i * j < MAXN; j++) { isPrime[i*j] = false; } } } for (int i = 2; i < MAXN; i++) { if (isPrime[i]) prime.push_back(i); } } int main(void) { createPrime(); int K, N; cin >> K; cin >> N; int startIndex = 0; int endIndex = 0; for (int i = 0; ; i++) { if (prime[i] >= K) { startIndex = i; break; } } for (int i = startIndex; ; i++) { if (prime[i] > N) { endIndex = i; break; } } // cout << startIndex << " " << endIndex << endl; // しゃくとり法 int ansIndex = -1; int maxLength = 0; int s = startIndex, t = startIndex; while (1) { // collisionするまで長さを増やす // cout << "start " << s << endl; while (t < endIndex) { int tmp = getHash(prime[t]); if (flag[tmp]) break; else { flag[tmp] = true; t++; } } // cout << "end " << t << endl; if (maxLength <= t - s) { ansIndex = s; maxLength = t-s; } flag[getHash(prime[s])] = false; s++; if (t >= endIndex) break; } cout << prime[ansIndex] << endl; return 0; }