#include <bits/stdc++.h>
using namespace std;
const int N = 1111111;
const int M = 111111;
vector<int> vec;
int a[N];
int n, A, B;
long long dp[N][3];
void get_pri_factor(int x) {
  for (int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
      vec.push_back(i);
      while (x % i == 0) x /= i;
    }
  }
  if (x > 1) vec.push_back(x);
}
long long get_cost(int x, int y) {
  if (x % y == 0) return 0;
  if ((x + 1) % y == 0) return B;
  if ((x - 1) % y == 0) return B;
  return LLONG_MAX;
}
void check_min(long long &a, long long b) {
  if (a > b) a = b;
}
void solve() {
  get_pri_factor(a[1]);
  get_pri_factor(a[1] - 1);
  get_pri_factor(a[1] + 1);
  get_pri_factor(a[n]);
  get_pri_factor(a[n] - 1);
  get_pri_factor(a[n] + 1);
  sort(vec.begin(), vec.end());
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
  long long ans = LLONG_MAX;
  for (int k = 0; k < vec.size(); k++) {
    int x = vec[k];
    for (int i = 0; i <= n; i++) {
      for (int j = 0; j <= 2; j++) {
        dp[i][j] = LLONG_MAX;
      }
    }
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++) {
      long long cost = get_cost(a[i], x);
      if (dp[i - 1][0] < LLONG_MAX) {
        if (cost < LLONG_MAX) check_min(dp[i][0], dp[i - 1][0] + cost);
        check_min(dp[i][1], dp[i - 1][0] + A);
      }
      if (dp[i - 1][1] < LLONG_MAX) {
        check_min(dp[i][1], dp[i - 1][1] + A);
        if (cost < LLONG_MAX) dp[i][2] = min(dp[i][2], dp[i - 1][1] + cost);
      }
      if (dp[i - 1][2] < LLONG_MAX) {
        if (cost < LLONG_MAX) check_min(dp[i][2], dp[i - 1][2] + cost);
      }
    }
    ans = min(ans, min(dp[n][0], min(dp[n][1], dp[n][2])));
  }
  cout << ans << endl;
}
int main() {
  scanf("%d%d%d", &n, &A, &B);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  solve();
  return 0;
}
