#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,mmx,popcnt,tune=native")
using namespace std;
const long long inf = (long long)1e18 + 228;
const long long cst = (long long)2e5 + 5;
const long long mod = (long long)1e9 + 7;
void operator delete(void*);
void ex(int exitCode = 0) { exit(exitCode); }
inline long long fact(long long x) {
  if (x == 0) return 1;
  return x * fact(x - 1);
}
long long n, k, s;
vector<long long> vc;
inline vector<pair<long long, long long>> f(long long l, long long r) {
  vector<pair<long long, long long>> ret;
  vector<long long> tk(r - l + 1, 0);
  while (!tk.back()) {
    long long tw = 0;
    for (int i = 0; i < tk.size() - 1; i++) {
      if (tk[i] == 2) tw++;
      if (vc[l + i] > 20 && tk[i] == 2) tw = 100;
    }
    if (tw <= k) {
      long long sm = 0;
      for (int i = 0; i < tk.size(); i++) {
        if (tk[i] == 0) continue;
        if (tk[i] == 1)
          sm += vc[l + i];
        else
          sm += fact(vc[l + i]);
      }
      ret.push_back(pair<long long, long long>(tw, sm));
    }
    tk[0]++;
    for (int i = 0; i < tk.size() - 1; i++) {
      tk[i + 1] += tk[i] / 3;
      tk[i] %= 3;
    }
  }
  return ret;
}
int main() {
  cin.tie(0)->sync_with_stdio(0);
  cout.tie(0);
  cin >> n >> k >> s;
  vc.resize(n);
  for (long long& i : vc) cin >> i;
  auto v1 = f(0, (n + 1) / 2);
  auto v2 = f((n + 1) / 2, n);
  cerr << "---";
  cerr.flush();
  vector<long long> mp[40];
  for (auto i : v2) {
    mp[i.first].push_back(i.second);
  }
  for (int i = 0; i < 40; i++) sort(mp[i].begin(), mp[i].end());
  if (mp[0].empty()) mp[0].push_back(0);
  long long ans = 0;
  for (auto i : v1) {
    for (int q = 0; q <= k - i.first; q++)
      ans += upper_bound(mp[q].begin(), mp[q].end(), s - i.second) -
             lower_bound(mp[q].begin(), mp[q].end(), s - i.second);
  }
  cout << ans;
  ex();
}
