def factorize(n): factors = {} while n % 2 == 0: factors[2] = factors.get(2, 0) + 1 n = n // 2 i = 3 while i * i <= n: while n % i == 0: factors[i] = factors.get(i, 0) + 1 n = n // i i += 2 if n > 1: factors[n] = 1 return factors def generate_divisors(factors): divisors = [1] for p, exp in factors.items(): current_length = len(divisors) p_pows = [] for e in range(1, exp + 1): p_pows.append(p ** e) for pow_p in p_pows: for i in range(current_length): divisors.append(divisors[i] * pow_p) return sorted(divisors) def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]); idx +=1 M = int(input[idx]); idx +=1 A = int(input[idx]); idx +=1 B = int(input[idx]); idx +=1 C = list(map(int, input[idx:idx+M])) forbidden_set = set(C) if N == 1: print(-1) return factors = factorize(N) divisors = generate_divisors(factors) if N not in divisors: divisors.append(N) divisors = sorted(divisors) dp = {d: float('inf') for d in divisors} dp[1] = 0 for d in divisors: if d == 1: continue possible_prevs = [prev for prev in divisors if prev < d and d % prev == 0] for prev in possible_prevs: s = d // prev if s < 2: continue invalid = False for c in C: if c % prev != 0: continue q = c // prev if 2 <= q <= s: invalid = True break if not invalid: if dp[prev] + (s-1)*A + B < dp[d]: dp[d] = dp[prev] + (s-1)*A + B min_cost = float('inf') for d in divisors: if d >= N: continue if N % d != 0: continue k = (N // d) - 1 if k < 0: continue invalid = False for c in C: if c < d * 2: continue if c > d * k: continue if c % d == 0: invalid = True break if not invalid: total_cost = dp[d] + k * A if total_cost < min_cost: min_cost = total_cost print(-1 if min_cost == float('inf') else min_cost) if __name__ == '__main__': main()