#include <bits/stdc++.h>
struct node {
  long long v, st;
  int id, y;
} b[3000005], c[3000005];
int tot1, tot2;
int n, K, flag, a[200005], d[200005];
long long S, bin[50], jc[50], ans;
bool cmp(node a, node b) { return a.v < b.v; }
long long read() {
  long long t = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') {
    t = t * 10 + ch - '0';
    ch = getchar();
  }
  return t * f;
}
int lowbit(int x) { return (x) & (-x); }
bool pd(long long st1, long long st2) {
  int cnt = 0;
  while (st1) {
    long long t = st1 % 3;
    if (t == 2) cnt++;
    st1 /= 3;
  }
  while (st2) {
    long long t = st2 % 3;
    if (t == 2) cnt++;
    st2 /= 3;
  }
  return cnt <= K;
}
void dfs(int k, long long st, long long res, int cnt, int lim) {
  if (k > lim) {
    if (flag == 0) {
      tot1++;
      b[tot1].v = res;
      b[tot1].st = st;
      b[tot1].id = 0;
      b[tot1].y = cnt;
    } else {
      tot2++;
      c[tot2].v = res;
      c[tot2].st = st;
      c[tot2].id = 1;
      c[tot2].y = cnt;
    }
    return;
  }
  dfs(k + 1, st + bin[k - 1] * 0, res, cnt, lim);
  dfs(k + 1, st + bin[k - 1] * 1, res + a[k], cnt, lim);
  if (a[k] <= 19 && res + jc[a[k]] <= S && cnt + 1 <= K)
    dfs(k + 1, st + bin[k - 1] * 2, res + jc[a[k]], cnt + 1, lim);
}
int num(long long x) {
  int cnt = 0;
  while (x) {
    long long t = x % 3;
    if (t == 2) cnt++;
    x /= 3;
  }
  return cnt;
}
void up(int x, int v) {
  for (int i = x; i <= K; i++) d[i] += v;
}
int ask(int x) { return d[x]; }
int main() {
  n = read();
  K = read();
  S = read();
  bin[0] = 1;
  for (int i = 1; i <= 20; i++) bin[i] = bin[i - 1] * 3;
  jc[0] = 1;
  for (int i = 1; i <= 19; i++) jc[i] = jc[i - 1] * i;
  for (int i = 1; i <= n; i++) a[i] = read();
  flag = 0;
  dfs(1, 0, 0, 0, (n + 1) >> 1);
  flag = 1;
  dfs(((n + 1) >> 1) + 1, 0, 0, 0, n);
  std::sort(b + 1, b + 1 + tot1, cmp);
  std::sort(c + 1, c + 1 + tot2, cmp);
  int j = tot2;
  for (int i = 1; i <= tot1 && j;) {
    for (; j && b[i].v + c[j].v > S; j--)
      ;
    if (b[i].v + c[j].v == S) {
      for (int y = 0; y <= K; y++) d[y] = 0;
      for (; i <= tot1 && b[i].v + c[j].v == S; i++) d[b[i].y]++;
      for (int y = 1; y <= K; y++) d[y] += d[y - 1];
      for (; j && b[i - 1].v + c[j].v == S; j--) ans += d[K - c[j].y];
    } else
      i++;
  }
  printf("%I64d\n", ans);
  return 0;
}
