// yukicoder: No.6 使いものにならないハッシュ // 2019.4.7 bal4u // 素数表、バカ計算 #include #include #define MAX 200002 #define SQRT 447 char notPrime[MAX] = { 1,1,0,0,1 }; // zero: if prime int ptbl[18000] = { 2, 3, 5, 7, 11, 13 }; int sz; // 17984 char a[18000]; typedef struct { int fr, to; char n; } T; T t[18000]; void sieve() { int i, j; for (i = 3; i <= SQRT; i += 2) { if (!notPrime[i]) { for (j = i * i; j < MAX; j += i) notPrime[j] = 1; } } sz = 1; for (i = 3; i <= MAX; i += 2) if (!notPrime[i]) ptbl[sz++] = i; } int calc(int n) { int s; if (n < 10) return n; s = 0; while (n) s += n % 10, n /= 10; return calc(s); } int upper_bound(int x) { int m, l = 0, r = sz; while (l < r) { m = (l + r) >> 1; if (ptbl[m] <= x) l = m + 1; else r = m; } return l - 1; } int getLen(int fr, int tid) { int i, j, ans, len; char f[10]; len = ans = 0; for (i = tid; ptbl[i] >= fr; i--) { memset(f, 0, 10); f[a[i]] = 1; for (j = i - 1; ptbl[j] >= fr; j--) { if (f[a[j]]) break; f[a[j]] = 1; } if (i - j > len) len = i - j, ans = ptbl[j + 1]; } return ans; } int main() { int i, k, K, N; sieve(); for (i = 0; i < sz; i++) a[i] = calc(ptbl[i]); scanf("%d%d", &K, &N); k = upper_bound(N); printf("%d\n", getLen(K, k)); return 0; }