#include <bits/stdc++.h>
using namespace std;
long long MOD;
long long nor(long long first) { return (first + MOD) % MOD; }
long long add(long long first, long long second) {
  return (nor(first) + nor(second)) % MOD;
}
long long mul(long long first, long long second) {
  return (nor(first) * nor(second)) % MOD;
}
long long sub(long long first, long long second) { return add(first, -second); }
void add2(long long &first, long long second) { first = add(first, second); }
struct Vec {
  long long a[4];
  void init() { memset(a, 0, sizeof(a)); }
  Vec() { init(); }
};
struct Mat {
  long long a[4][4];
  void init() { memset(a, 0, sizeof(a)); }
  void tran() {
    init();
    a[0][0] = 3;
    a[0][3] = nor(-1);
    a[1][1] = a[1][2] = a[2][1] = a[3][3] = 1;
  }
  void eye() {
    init();
    for (int i = (0); i < (int)(4); i++) a[i][i] = 1;
  }
  Mat() { init(); }
  Mat operator*(Mat m) {
    Mat res;
    for (int i = (0); i < (int)(4); i++)
      for (int j = (0); j < (int)(4); j++)
        for (int k = (0); k < (int)(4); k++)
          add2(res.a[i][j], mul(a[i][k], m.a[k][j]));
    return res;
  }
  Mat operator^(long long k) {
    Mat res;
    if (k == 0) {
      res.eye();
      return res;
    }
    Mat u = (*this) ^ (k / 2);
    res = u * u;
    if (k % 2) res = res * (*this);
    return res;
  }
  Vec operator*(Vec v) {
    Vec res;
    for (int i = (0); i < (int)(4); i++)
      for (int j = (0); j < (int)(4); j++) add2(res.a[i], mul(a[i][j], v.a[j]));
    return res;
  }
};
int n;
long long first, second;
const int N = 5000000;
long long a[N];
int main() {
  scanf("%d%I64d%I64d%I64d", &n, &first, &second, &MOD);
  for (int i = (0); i < (int)(n); i++) scanf("%I64d", a + i);
  if (n == 1) {
    printf("%I64d\n", nor(a[0]));
    return 0;
  }
  long long sum = accumulate(a, a + n, 0LL);
  Vec v0;
  v0.a[0] = sum;
  v0.a[1] = 1;
  v0.a[2] = 0;
  v0.a[3] = a[0] + a[n - 1];
  Mat tran;
  tran.tran();
  Vec vn = (tran ^ first) * v0;
  long long mx = add(mul(vn.a[1], a[n - 1]), mul(vn.a[2], a[n - 2]));
  v0.a[0] = vn.a[0];
  v0.a[3] = add(a[0], mx);
  Vec vm = (tran ^ second) * v0;
  long long ans = vm.a[0];
  printf("%I64d\n", ans);
}
