#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int N, K;
LL S;
int a[26];
LL A[26];
map<LL, int> sum[26];
void dfs(int p, int k, LL s)
{
if(s > S || k > K) return;
if(p == N / 2) {
sum[k][s] ++;
} else {
dfs(p+1, k, s);
dfs(p+1, k, a[p]+s);
if(a[p] < 20)
dfs(p+1, k+1, s+A[a[p]]);
}
}
LL answer = 0;
void dfs2(int p, int k, LL s)
{
if(s > S || k > K) return;
if(p == N) {
for(int i=0;i<=K-k;i++) if(sum[i].count(S - s)) {
answer += sum[i][S-s];
}
} else {
dfs2(p+1, k, s);
dfs2(p+1, k, s + a[p]);
if(a[p] < 20)
dfs2(p+1, k+1, s+A[a[p]]);
}
}
int main()
{
A[0] = 1;
for(int i = 1; i < 20; i ++)
A[i] = A[i - 1] * i;
scanf("%d%d%I64d", &N, &K, &S);
for(int i=0;i<N;i++)
scanf("%d", &a[i]);
dfs(0, 0, 0);
dfs2(N / 2, 0, 0);
printf("%I64d\n", answer);
return 0;
}
Codeforces Round #297 (Div. 2) E - Anya and Cubes
最新推荐文章于 2022-11-22 23:15:14 发布