#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const double PI = 3.14159265359;
int n, k;
long long S;
vector<vector<long long>> dp(25);
vector<long long> fact(20, 1ll);
long long getFactVal(int mask, vector<long long>& vi) {
  long long ans = 0;
  int m = vi.size();
  for (int i = 0; i < m; i++) {
    if ((1 << i) & mask) {
      if (vi[i] > 19) {
        return S + 1;
      } else {
        ans += fact[vi[i]];
      }
    }
    if (ans > S) {
      return S + 1;
    }
  }
  return ans;
}
long long getVal(int mask, vector<long long>& vi) {
  long long ans = 0;
  int m = vi.size();
  for (int i = 0; i < m; i++) {
    if ((1 << i) & mask) {
      ans += vi[i];
    }
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k >> S;
  vector<long long> v1, v2;
  for (int i = 0; i < n; i++) {
    long long x;
    cin >> x;
    if (i < n / 2)
      v1.push_back(x);
    else
      v2.push_back(x);
  }
  fact.push_back(0ll);
  for (int i = 1; i <= 19; i++) {
    fact[i] = fact[i - 1] * i;
  }
  for (int mask2 = 0; mask2 < (1 << v2.size()); mask2++) {
    auto val = getFactVal(mask2, v2);
    if (val <= S) {
      for (int mask1 = 0; mask1 < (1 << v2.size()); mask1++) {
        if (!(mask1 & mask2)) {
          auto val2 = getVal(mask1, v2);
          if (val + val2 <= S) {
            dp[__builtin_popcount(mask2)].push_back(val + val2);
          }
        }
      }
    }
  }
  long long ans = 0;
  for (int i = 0; i < 25; i++) {
    if (dp[i].size()) {
      sort(dp[i].begin(), dp[i].end());
    }
  }
  for (int mask2 = 0; mask2 < (1 << v1.size()); mask2++) {
    auto val = getFactVal(mask2, v1);
    int k1 = __builtin_popcount(mask2);
    if (val <= S && k1 <= k) {
      for (int mask1 = 0; mask1 < (1 << v1.size()); mask1++) {
        if (!(mask1 & mask2)) {
          auto val2 = getVal(mask1, v1) + val;
          if (val2 <= S) {
            for (int i = 0; i <= min(k - k1, 13); i++) {
              if (dp[i].size()) {
                ans += upper_bound(dp[i].begin(), dp[i].end(), S - val2) -
                       lower_bound(dp[i].begin(), dp[i].end(), S - val2);
              }
            }
          }
        }
      }
    }
  }
  cout << ans;
  return 0;
}
