求救玄关
查看原帖
求救玄关
587615
zqh123b楼主2024/8/2 15:30
#include<bits/stdc++.h>
using namespace std;
//define!
#define psba push_back
#define vet vector<int>
#define ll long long
#define con const int
#define conll const long long
#define conti continue
#define bre break
#define vetpa vector<pair<int,int> >
#define fir first
#define sec second
#define intpair pair<int,int>
#define llpair pair<ll,ll>
//update:2024/8/2
con N=25;
int n,k,s,a[N],l[N];
ll ans=0;
map<llpair,ll> mp;
map<ll,bool> vis;
ll use(int x){
	ll ans=1;
	for(int i=x;i>=1;i--){
		if(ans>s/i)return -1;
		ans*=i;
	}
	return ans;
}
void check(){
	ll sum=0,tot=0;
	for(int i=1;i<=n/2;i++){
		if(l[i]==2){
			int L=use(a[i]);
			if(L==-1||sum+L>s||tot+1>k)return;
			sum+=L;
			tot++;
		}
		if(l[i]==3){
			if(sum+a[i]>s)return;
			sum+=a[i];
		}
	}
	mp[{tot,sum}]++;
	vis[sum]=true;
}
void dfs(int x){
	if(x>n/2){
		check();
		return;
	}
	for(int i=1;i<=3;i++){
		l[x]=i;
		dfs(x+1);
	}
}
ll answer(ll tot,ll sum){
	ll out=0;
	for(int i=0;i<=tot;i++){
		out+=mp[{i,sum}];
	}
	return out;
}
void CHECK(){
	ll sum=0,tot=0;
	for(int i=n/2+1;i<=n;i++){
		if(l[i]==2){
			int L=use(a[i]);
			if(L==-1||sum+L>s||tot+1>k)return;
			sum+=L;
			tot++;
		}
		if(l[i]==3){
			if(sum+a[i]>s)return;
			sum+=a[i];
		}
	}
	if(vis.count(s-sum))ans+=answer(k-tot,s-sum);
}
void DFS(int x){
	if(x>n){
		CHECK();
		return;
	}
	for(int i=1;i<=3;i++){
		l[x]=i;
		DFS(x+1);
	}
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>k>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1);
	DFS(n/2+1);
	cout<<ans<<endl;
// 	fclose(stdin);
//	fclose(stdout);
	return 0;
}

WA{\color{red}WA} on#6on^\#6

2024/8/2 15:30
加载中...