#include<bits/stdc++.h>
#define int long long
using namespace std;
long long a[30];
long long n,k,s;
struct node{
long long jc,sum;
};
bool operator<(node t1,node t2){
return t1.jc==t2.jc?t1.sum<t2.sum:t1.jc<t2.jc;
}
map<node,long long> M;
map<long long,long long> M2;
long long ans=0;
long long jie(long long t1){
if(M2.find(t1)!=M2.end()){
return M2[t1];
}
long long ans=1;
for(int i=1;i<=t1;i++){
ans*=i;
}
M2[t1]=ans;
return ans;
}
void dfs1(int now,int up,int jc,long long sum){
if(jc>k||sum>s)return;
if(now>up){
//cout<<sum<<" "<<now<<endl;
M[node{jc,sum}]++;
return;
}
dfs1(now+1,up,jc+1,sum+jie(a[now]));
dfs1(now+1,up,jc,sum+a[now]);
dfs1(now+1,up,jc,sum);
}
map<node,long long> MM;
long long qwe(int t1,int t2){
// cout<<;
if(t1<0)return 0;
if(MM.find(node{t1,t2})!=MM.end()){
return MM[node{t1,t2}];
}
long long answ=0;
if(M.find(node{t1,t2})!=M.end()){
answ+=M[node{t1,t2}];
}
// long long temp=ans;
answ+=qwe(t1-1,t2);
// cout<<temp<<" "<<t1<<" "<<t2 <<" "<<ans<<" "<<qwe(t1-1,t2)<<endl;
MM[node{t1,t2}]=answ;
return answ;
}
void dfs2(int now,int up,int jc,long long sum){
if(jc>k||sum>s)return;
if(now<up){
ans+=qwe(k-jc,s-sum);
// cout<<qwe(k-jc,s-sum)<<" ";
// for(int i=k-jc;i>=0;i--){
//// cout<<i<<" "<<(s-sums)<<" "<<(M[node{i,s-sum}])<<endl;
//// ans+=M[node{i,s-sum}];
// qwe()
// }
return;
}
dfs2(now-1,up,jc+1,sum+jie(a[now]));
dfs2(now-1,up,jc,sum+a[now]);
dfs2(now-1,up,jc,sum);
}
signed main(){
ios::sync_with_stdio(false);
// freopen("test.in","r",stdin);
cin>>n>>k>>s;
// if(s==(long long)13326087796){
// cout<<1;
// return 0;
// }
for(int i=1;i<=n;i++){
cin>>a[i];
// scanf("%lld",&a[i]);
}
int mid=n/2;
dfs1(1,mid,0,0);
// cout<<qwe(0,24);
dfs2(n,mid+1,0,0);
cout<<ans;
return 0;
}
tle了第20个点,数据是
25 16 13326087796
157576937 627434432 942652043 706432863 631136945 714549755 465703470 663358517 695561723 249240606 833566455 396564536 758483017 253748999 978210764 530023233 193812243 317718202 184788435 892848108 150420430 330992298 780787784 196460118 674015883
在本地可以跑过,试了下洛谷的在线IDE也会tle,不清楚是哪里的问题