import bisect def sieve(n): if n < 2: return [] sieve = [True] * (n + 1) sieve[0] = sieve[1] = False for i in range(2, int(n**0.5) + 1): if sieve[i]: sieve[i*i : n+1 : i] = [False] * len(sieve[i*i : n+1 : i]) primes = [i for i, is_prime in enumerate(sieve) if is_prime] return primes def main(): N = int(input().strip()) primes = sieve(N) if not primes: print(-1) return if N == 2: print(1) return # Compute cumulative sums cumulative = [] s = 0 for p in primes: s += p cumulative.append(s) if s > N: break max_m = 0 for i in range(len(cumulative)): if cumulative[i] <= N: max_m = i + 1 # 1-based index else: break found = False for m in range(max_m, 0, -1): sum_m = cumulative[m-1] D = N - sum_m if D < 0: continue if D == 0: print(m) return initial_primes = primes[:m] available_primes = primes[m:] available_set = set(available_primes) available_sorted = available_primes # Check single replacement for p in initial_primes: q = p + D if q in available_set and q > p: print(m) return # Check pair replacement for i_p1 in range(m): p1 = initial_primes[i_p1] for i_p2 in range(i_p1 + 1, m): p2 = initial_primes[i_p2] required_sum = p1 + p2 + D max_q1 = required_sum - p2 - 1 if max_q1 < p1 + 1: continue left = bisect.bisect_right(available_sorted, p1) right = bisect.bisect_right(available_sorted, max_q1) for q1 in available_sorted[left:right]: q2 = required_sum - q1 if q2 in available_set and q2 > p2 and q2 != q1: print(m) return print(-1) if __name__ == "__main__": main()