rt,TLE on # 91,没有死循环。
不会卡常数啊/kel
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define int long long
#define maxn 30
// #ifndef ONLINE_JUDGE
#define getchar_unlocked() getchar()
// #endif
using namespace std;
int read() {
int x=0,flag=1;char c=getchar_unlocked();
while(c<'0'||c>'9') {if(c=='-')flag=-1;c=getchar_unlocked();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar_unlocked();}
return x*flag;
}
int n, K, s, ans = 0;
int a[maxn];
int opr[maxn];
map <pair<int, int>, int> p;
int frac(int k) {
int sum = 1;
for (int i = 1 ; i <= k; i++) {
sum *= i;
if (sum > s) {
sum = s + 1;
break;
}
}
return sum;
}
void dfs(int k, int op) {
if (k > n / 2) {
return;
}
int now = 0;
for (int i = 1; i <= n / 2; i++) {
if (opr[i] == 1) {
now += a[i];
}
else if (opr[i] == 2) {
now += frac(a[i]);
}
}
int res = 0;
for (int i = 1; i <= n / 2; i++) {
if (opr[i] == 2) {
res++;
}
}
if (k == n / 2 && now <= s)
p[{now, res}] ++;
opr[k + 1] = 0; dfs(k + 1, 0);
opr[k + 1] = 1; dfs(k + 1, 1);
opr[k + 1] = 2; dfs(k + 1, 2);
opr[k + 1] = 0;
return ;
}
void dfs2(int k, int op) {
if (k > n) {
return;
}
int now = 0;
for (int i = n / 2 + 1; i <= n; i++) {
if (opr[i] == 1) {
now += a[i];
}
else if (opr[i] == 2) {
now += frac(a[i]);
}
}
int res = 0;
for (int i = n / 2 + 1; i <= n; i++) {
if (opr[i] == 2) {
res++;
}
}
if (k == n && now <= s) {
for (int i = 0; i <= K - res; i++) {
ans += p[{s - now, i}];
}
}
opr[k + 1] = 0; dfs2(k + 1, 0);
opr[k + 1] = 1; dfs2(k + 1, 1);
opr[k + 1] = 2; dfs2(k + 1, 2);
opr[k + 1] = 0;
return ;
}
signed main() {
n = read(), K = read(), s = read();
for (int i = 1; i <= n; i++) {
a[i] = read();
}
dfs(0, 0);
// for (const auto& [key, value] : p) {
// std::cout << "Key: (" << key.first << ", " << key.second << "), Value: " << value << "\n";
// }
dfs2(n / 2, 0);
cout << ans << endl;
return 0;
}