#include <bits/stdc++.h>
using namespace std;
long long a[10000];
long long fac[] = {1,
                   1,
                   2,
                   6,
                   24,
                   120,
                   720,
                   5040,
                   40320,
                   362880,
                   3628800,
                   39916800,
                   479001600,
                   6227020800,
                   87178291200,
                   1307674368000,
                   20922789888000,
                   355687428096000,
                   6402373705728000};
struct node {
  long long value;
  long long use;
  long long count;
  int next;
};
struct Hash {
  long long Table[100003], cnt;
  node List[3000000];
  void Clear() {
    cnt = 0ll;
    for (int i = 0; i < 100003; i++) Table[i] = -1ll;
  }
  void Insert(long long v, long long use) {
    long long hash = v % 100003;
    long long temp = Table[hash];
    while (temp != -1) {
      if (List[temp].value == v && List[temp].use == use) {
        List[temp].count++;
        return;
      }
      temp = List[temp].next;
    }
    List[cnt].value = v;
    List[cnt].use = use;
    List[cnt].count = 1;
    List[cnt].next = Table[hash];
    Table[hash] = cnt;
    cnt++;
  }
  long long Search(long long v, long long use) {
    long long hash = v % 100003;
    hash = Table[hash];
    long long ret = 0;
    while (hash != -1) {
      if (List[hash].value == v && List[hash].use <= use)
        ret += List[hash].count;
      hash = List[hash].next;
    }
    return ret;
  }
} H;
long long S, K, N, ans;
void dfs1(long long cur_n, long long n, long long v, long long u) {
  if (cur_n > n + 1 || u > K || v > S) return;
  if (cur_n == n + 1) {
    H.Insert(v, u);
    return;
  }
  if (a[cur_n] < 19) dfs1(cur_n + 1, n, v + fac[a[cur_n]], u + 1);
  dfs1(cur_n + 1, n, v + a[cur_n], u);
  dfs1(cur_n + 1, n, v, u);
}
void dfs2(long long cur_n, long long n, long long v, long long u) {
  if (cur_n > n + 1 || u > K || v > S) return;
  if (cur_n == n + 1) {
    ans += H.Search(S - v, K - u);
    return;
  }
  if (a[cur_n] < 19) dfs2(cur_n + 1, n, v + fac[a[cur_n]], u + 1);
  dfs2(cur_n + 1, n, v + a[cur_n], u);
  dfs2(cur_n + 1, n, v, u);
}
int main() {
  long long i, j;
  cin >> N >> K >> S;
  for (i = 0; i < N; i++) cin >> a[i];
  ans = 0;
  H.Clear();
  dfs1(0ll, N / 2 - 1ll, 0ll, 0ll);
  dfs2(N / 2ll, N - 1ll, 0ll, 0ll);
  cout << ans << "\n";
  return 0;
}
