#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
const int maxn = 1e5 + 10;
long long n, k, s;
long long a[30], ans;
long long p[30];
struct node {
  long long sum, y;
  node(long long ss = 0, long long kk = 0) : sum(ss), y(kk) {}
  bool operator<(const node& rhs) const {
    if (sum == rhs.sum) return y < rhs.y;
    return sum < rhs.sum;
  }
};
map<node, int> mp;
map<node, int>::iterator it;
void dfs1(int nn, int kk, long long ss) {
  if (k < kk) return;
  if (ss > s) return;
  if (nn > n / 2) {
    node t(ss, kk);
    mp[t]++;
    return;
  }
  dfs1(nn + 1, kk, ss);
  dfs1(nn + 1, kk, ss + a[nn]);
  if (a[nn] <= 20) dfs1(nn + 1, kk + 1, ss + p[a[nn]]);
}
void dfs2(int nn, int kk, long long ss) {
  if (k < kk) return;
  if (ss > s) return;
  if (nn > n) {
    it = mp.lower_bound(node(s - ss, 0));
    for (; it != mp.end(); it++) {
      if (it->first.sum == s - ss && k - it->first.y >= kk) ans += it->second;
      if (it->first.sum != s - ss) break;
    }
    return;
  }
  dfs2(nn + 1, kk, ss);
  dfs2(nn + 1, kk, ss + a[nn]);
  if (a[nn] <= 20) dfs2(nn + 1, kk + 1, ss + p[a[nn]]);
}
int main() {
  p[1] = 1;
  for (int i = 2; i <= 20; i++) p[i] = i * p[i - 1];
  n = read(), k = read(), s = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  int mid = n / 2;
  dfs1(1, 0, 0);
  dfs2(mid + 1, 0, 0);
  cout << ans << endl;
  return 0;
}
