#include <bits/stdc++.h>
using namespace std;
int main(int argc, char **argv) {
  ios_base::sync_with_stdio(false);
  long long n, k, S;
  cin >> n >> k >> S;
  vector<long long> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  vector<long long> df(25 + 1, 0);
  long long res = 1;
  int maxEx = 1;
  long long FMAX = 10000000000000000L;
  for (int i = 1; i <= 25; i++) {
    if (res > FMAX / i) {
      maxEx = i - 1;
      break;
    }
    res *= i;
    df[i] = res - i;
  }
  sort(a.begin(), a.end());
  vector<map<long long, int> > cnt1(k + 1);
  int secondStart = n / 2;
  if (secondStart < 0) {
    secondStart = 0;
  }
  int len = secondStart - 0;
  for (int mask = 0; mask < (1 << len); mask++) {
    vector<int> selected;
    long long s = 0;
    int exLen = 0;
    for (int bit = 0; bit < len; bit++) {
      if (mask & (1 << bit)) {
        selected.push_back(bit);
        s += a[bit];
        if (s > S) {
          break;
        }
        if (a[bit] <= maxEx) {
          exLen++;
        }
      }
    }
    if (s > S) {
      continue;
    }
    for (int maskEx = 0; maskEx < (1 << exLen); maskEx++) {
      long long diff = 0;
      int cntEx = 0;
      for (int bit = 0; bit < exLen; bit++) {
        if (maskEx & (1 << bit)) {
          cntEx++;
          if (cntEx > k) {
            break;
          }
          diff += df[a[selected[bit]]];
          if (s + diff > S) {
            break;
          }
        }
      }
      if ((cntEx <= k) && (s + diff <= S)) {
        cnt1[cntEx][s + diff]++;
      }
    }
  }
  vector<map<long long, int> > cnt2(k + 1);
  len = n - secondStart;
  for (int mask = 0; mask < (1 << len); mask++) {
    vector<int> selected;
    long long s = 0;
    int exLen = 0;
    for (int bit = 0; bit < len; bit++) {
      if ((1 << bit) & mask) {
        selected.push_back(secondStart + bit);
        s += a[bit + secondStart];
        if (s > S) {
          break;
        }
        if (a[bit + secondStart] <= maxEx) {
          exLen++;
        }
      }
    }
    if (s > S) {
      continue;
    }
    for (int maskEx = 0; maskEx < (1 << exLen); maskEx++) {
      int cntEx = 0;
      long long diff = 0;
      for (int bit = 0; bit < exLen; bit++) {
        if (maskEx & (1 << bit)) {
          cntEx++;
          if (cntEx > k) {
            break;
          }
          diff += df[a[selected[bit]]];
          if (s + diff > S) {
            break;
          }
        }
      }
      if ((cntEx <= k) && (s + diff <= S)) {
        cnt2[cntEx][s + diff]++;
      }
    }
  }
  long long ans = 0;
  for (int t = 0; t <= k; t++) {
    for (map<long long, int>::iterator it2 = cnt2[t].begin();
         it2 != cnt2[t].end(); it2++) {
      long long s2 = it2->first;
      long long num2 = it2->second;
      if (s2 > S) {
        break;
      }
      if (secondStart == 0) {
        if (s2 == S) {
          ans += num2;
        }
      } else {
        long long s1 = S - s2;
        map<long long, int>::iterator it1;
        int k1 = k - t;
        long long num1 = 0;
        for (int t1 = 0; t1 <= k1; t1++) {
          it1 = cnt1[t1].find(s1);
          if (it1 != cnt1[t1].end()) {
            num1 += it1->second;
          }
        }
        ans += num2 * num1;
      }
    }
  }
  cout << ans << endl;
  return 0;
}
