#include <bits/stdc++.h>
using namespace std;
const int L = 30;
long long n, k, s, ans = 0, brk = 0;
long long value[L], fact[L];
map<long long, long long> avail[25];
long long getFactorial(long long x) {
  if (x > 20) return -1;
  long long res = 1;
  for (long long i = 1; i <= x; i++) {
    res *= i;
  }
  return res;
}
void rec(int it, long long curSum, int used) {
  if (curSum > s) return;
  if (it > brk) {
    if (avail[used].find(curSum) == avail[used].end()) {
      avail[used].insert(make_pair(curSum, 1));
    } else {
      avail[used][curSum]++;
    }
    return;
  }
  rec(it + 1, curSum, used);
  if (s - curSum >= value[it]) {
    rec(it + 1, curSum + value[it], used);
  }
  if (value[it] <= 20 && used < k && (s - curSum >= fact[it])) {
    rec(it + 1, curSum + fact[it], used + 1);
  }
}
void preCount() {
  brk = (n - 1) / 2;
  rec(0, 0, 0);
}
void count(int it, long long curSum, int used) {
  if (curSum > s) return;
  if (it > brk) {
    for (int i = (int)k - used; i >= 0; i--) {
      if (avail[i].find(s - curSum) != avail[i].end()) {
        ans += avail[i][s - curSum];
      }
    }
    return;
  }
  count(it + 1, curSum, used);
  if (s - curSum >= value[it]) {
    count(it + 1, curSum + value[it], used);
  }
  if (value[it] <= 20 && used < k && (s - curSum >= fact[it])) {
    count(it + 1, curSum + fact[it], used + 1);
  }
}
int main() {
  scanf("%I64d%I64d%I64d", &n, &k, &s);
  for (int i = 0; i < n; i++) {
    scanf("%I64d", &value[i]);
  }
  sort(value, value + n);
  for (int i = 0; i < n; i++) {
    fact[i] = getFactorial(value[i]);
  }
  preCount();
  brk = n - 1;
  count((int)((n - 1) / 2) + 1, 0, 0);
  printf("%I64d", ans);
}
