#include <bits/stdc++.h>
using namespace std;
int n, m, a[30], b[30];
long long sum, fact[30];
unordered_map<long long, long long> mp[2][30];
unordered_map<long long, set<int>> st[2];
vector<int> vec[2];
int lg[1 << 20];
int F[1 << 20];
static inline int f(int x) {
  if (x && F[x]) return F[x];
  int ret = 0;
  for (; x; x -= x & -x) ret++;
  return F[x] = ret;
}
static inline void find(int x, int pos, int k, int n) {
  vector<int> &v = vec[x];
  if (pos == n) {
    long long tsum = 0;
    for (int i = (0); i < (n); i++)
      if (b[i]) tsum += b[i] == 1 ? v[i] : fact[v[i]];
    mp[x][m - k][tsum]++;
    st[x][tsum].insert(m - k);
    return;
  }
  if (k && v[pos] < 19) {
    b[pos] = 2;
    find(x, pos + 1, k - 1, n);
  }
  b[pos] = 0;
  find(x, pos + 1, k, n);
  b[pos] = 1;
  find(x, pos + 1, k, n);
}
int main() {
  for (int i = (0); i < (20); i++) lg[1 << i] = i;
  fact[0] = fact[1] = 1;
  for (int i = (2); i < (20); i++) fact[i] = fact[i - 1] * i;
  scanf("%d%d%lld", &n, &m, &sum);
  for (int i = (0); i < (2); i++)
    for (int j = (0); j <= (m); j++) mp[i][j].reserve(59993);
  for (int i = (0); i < (n); i++) scanf("%d", a + i);
  for (int i = (0); i < (n / 2); i++) vec[0].push_back(a[i]);
  for (int i = (n / 2); i < (n); i++) vec[1].push_back(a[i]);
  find(0, 0, m, vec[0].size());
  find(1, 0, m, vec[1].size());
  long long ans = 0;
  for (int i = (0); i <= (m); i++)
    for (__typeof__((mp[0][i]).begin()) it = (mp[0][i]).begin();
         it != (mp[0][i]).end(); it++) {
      if (it->first > sum) continue;
      for (__typeof__((st[1][sum - it->first]).begin()) it2 =
               (st[1][sum - it->first]).begin();
           it2 != (st[1][sum - it->first]).end(); it2++)
        if (*it2 + i <= m) ans += mp[1][*it2][sum - it->first] * it->second;
    }
  cout << ans << '\n';
  return 0;
}
