func_code_string: #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;   }   