#include <bits/stdc++.h>
using namespace std;
int n, m, k, A[30], T[30];
long long F[30], s, ways;
map<long long, vector<int> > M;
map<long long, vector<int> >::iterator p;
map<long long, int> P[30];
int main() {
  F[0] = 1;
  for (long long i = 1; i <= 18; i++) F[i] = F[i - 1] * i;
  scanf("%d%d%I64d", &n, &k, &s);
  for (int i = 0; i < n; i++) scanf("%d", &A[i]);
  m = n / 2, n = (n + 1) / 2;
  int l1 = 1 << n, l2 = 1 << m;
  for (int mask = 1; mask < l2; mask++) {
    int l = 0;
    for (int i = 0; i < m; i++)
      if (mask & 1 << i) T[l++] = A[i + n];
    int h = 1 << l;
    for (int i = 0; i < h; i++) {
      long long sum = 0;
      int cnt = __builtin_popcount(i);
      if (cnt > k) continue;
      int f = 0;
      for (int j = 0; j < l; j++) {
        if (i & 1 << j) {
          int val = T[j];
          if (val > 18) {
            f = 1;
            break;
          }
          if (sum <= s - F[val])
            sum += F[val];
          else {
            f = 1;
            break;
          }
        } else if (sum <= s - T[j])
          sum += T[j];
        else {
          f = 1;
          break;
        }
      }
      if (f == 1) continue;
      M[sum].push_back(cnt);
    }
  }
  M[0].push_back(0);
  for (p = M.begin(); p != M.end(); p++) {
    sort(p->second.begin(), p->second.end());
    for (int j = 0; j <= k; j++)
      P[j][p->first] = upper_bound(p->second.begin(), p->second.end(), j) -
                       p->second.begin();
  }
  for (int mask = 1; mask < l1; mask++) {
    int l = 0;
    for (int i = 0; i < n; i++)
      if (mask & 1 << i) T[l++] = A[i];
    int h = 1 << l;
    for (int i = 0; i < h; i++) {
      long long sum = 0;
      int cnt = __builtin_popcount(i);
      if (cnt > k) continue;
      int f = 0;
      for (int j = 0; j < l; j++) {
        if (i & 1 << j) {
          int val = T[j];
          if (val > 18) {
            f = 1;
            break;
          }
          if (sum <= s - F[val])
            sum += F[val];
          else {
            f = 1;
            break;
          }
        } else if (sum <= s - T[j])
          sum += T[j];
        else {
          f = 1;
          break;
        }
      }
      if (f == 1) continue;
      if (M[s - sum].empty()) continue;
      ways += P[k - cnt][s - sum];
    }
  }
  ways += M[s].size();
  printf("%I64d\n", ways);
  return 0;
}
