#include const long long sup = 1LL << 60; typedef struct Edge { struct Edge *next; int v; long long cost; } edge; void chmin(int* a, int b) { if (*a > b) *a = b; } int main() { int i, N, M, A, B, C[5001]; scanf("%d %d %d %d", &N, &M, &A, &B); for (i = 1; i <= M; i++) scanf("%d", &(C[i])); int n = 0, div[2001]; for (i = 1; i * i <= N; i++) { if (N % i != 0) continue; div[++n] = i; if (i * i != N) div[++n] = N / i; } int m = 0, u, w, min; edge *adj[2001] = {}, e[2000001], *p; for (u = 1; u <= n; u++) { for (i = 1, min = N + 1; i <= M; i++) if (C[i] % div[u] == 0) chmin(&min, C[i]); for (w = 1; w <= n; w++) { if (w == u || div[w] % div[u] != 0 || min <= div[w]) continue; e[m].v = w; e[m].cost = (long long)A * (div[w] / div[u] - 1) + B; e[m].next = adj[u]; adj[u] = &(e[m++]); } } int flag[2001] = {}, argmin; long long dist[2001], minll; for (u = 2, dist[1] = -B; u <= n; u++) dist[u] = sup; while (1) { for (u = 1, minll = sup; u <= n; u++) { if (flag[u] == 0 && minll > dist[u]) { minll = dist[u]; argmin = u; } } if (minll == sup) break; u = argmin; flag[u] = 1; for (p = adj[u]; p != NULL; p = p->next) { w = p->v; if (dist[w] > dist[u] + p->cost) dist[w] = dist[u] + p->cost; } } if (dist[2] == sup) printf("-1\n"); else printf("%lld\n", dist[2]); fflush(stdout); return 0; }