为什么不对
  • 板块CF525E Anya and Cubes
  • 楼主jixx
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/12/11 12:13
  • 上次更新2023/10/24 08:00:33
查看原帖
为什么不对
558377
jixx楼主2022/12/11 12:13
#include<iostream>
#include<map>
#define ll long long
using namespace std;
map<ll,ll> m[50];
ll n,k,S,t,ans;
ll a[50],f[50];
void dfs1(ll idx,ll sum,ll ch){//前部分 
	if(ch>k) return;
	if(idx>t){
		m[ch][sum]++;
		return;
	}
	dfs1(idx+1,sum,ch);//不选
	dfs1(idx+1,sum+a[idx],ch);//选
	if(a[idx]<=20) dfs1(idx+1,sum+f[a[idx]],ch+1);//选!
}
void dfs2(ll idx,ll sum,ll ch){//后部分 
	if(ch>k) return;
	if(idx>n){
		for(ll i=0;i<=k-ch;i++) ans+=m[i][S-sum];
		return;
	}
	dfs2(idx+1,sum,ch);//不选
	dfs2(idx+1,sum+a[idx],ch);//选
	if(a[idx]<=20) dfs2(idx+1,sum+f[a[idx]],ch+1);//选!
}
int main(){
	cin>>n>>k>>S;
	for(ll i=1;i<=n;i++) cin>>a[i];
	f[1]=1;
	for(ll i=2;i<=20;i++) f[i]=f[i-1]*i;
	t=n/2;
	dfs1(1,0,0);
	dfs2(t+1,0,0);
	cout<<ans<<endl;
	return 0;
}
2022/12/11 12:13
加载中...