def sieve(n): 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()) if N < 2: print(-1) return max_prime = 2 * N primes = sieve(max_prime) primes_set = set(primes) # Precompute the sum of first k primes sum_k = [] current_sum = 0 for p in primes: current_sum += p sum_k.append(current_sum) if current_sum > N: break max_k = len(sum_k) for k in reversed(range(1, max_k + 1)): if k > len(sum_k): continue s = sum_k[k-1] if s > N: continue D = N - s if D < 0: continue first_k = primes[:k] first_k_set = set(first_k) # Check single replacement for p in first_k: q = p + D if q in primes_set and q not in first_k_set: print(k) return # Check pair replacement for i in range(len(first_k)): for j in range(i + 1, len(first_k)): p1 = first_k[i] p2 = first_k[j] required = p1 + p2 + D if required > max_prime: continue for q1 in primes: if q1 >= required: break if q1 in first_k_set: continue q2 = required - q1 if q2 >= q1 and q2 in primes_set and q2 not in first_k_set: print(k) return print(-1) if __name__ == "__main__": main()