五年级升六年级 刚学完分数 封装了一个头文件
#include<bits/stdc++.h>
#define um unordered_map
#define ll long long
using namespace std;
const int N = 30;
int n , m , a[N] , mid , cnt1 , cnt2;
ll S , res , jc[N];
pair<int , ll> c[1594324] , d[1594324];
um<ll , int> st;
void dfs(int k , int j , ll v) {
if(k == mid + 1) {
c[++ cnt1] = {j , v};
return;
}
dfs(k + 1 , j , v);
if(v + a[k] <= S) dfs(k + 1 , j , v + a[k]);
if(j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) dfs(k + 1 , j + 1 , v + jc[a[k]]);
}
void redfs(int k , int j , ll v) {
if(k == n + 1) {
d[++ cnt2] = {j , v};
return;
}
redfs(k + 1 , j , v);
if(v + a[k] <= S) redfs(k + 1 , j , v + a[k]);
if(j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) redfs(k + 1 , j + 1 , v + jc[a[k]]);
}
int main(void) {
cin >> n >> m >> S;
jc[0] = 1;
for(int i = 1 ; i <= 18 ; ++ i) {
jc[i] = jc[i - 1] * i;
}
for(int i = 1 ; i <= n ; ++ i) {
cin >> a[i];
}
mid = n / 2;
dfs(1 , 0 , 0) , redfs(mid + 1 , 0 , 0);
sort(c + 1 , c + 1 + cnt1); sort(d + 1 , d + 1 + cnt2);
int j = cnt2;
for(int i = 1 ; i <= cnt2 ; ++ i) {
st[d[i].second] ++ ;
}
for(int i = 1 ; i <= cnt1 ; ++ i) {
while(j && c[i].first + d[j].first > m) {
st[d[j].second] -- ;
j -- ;
}
res += st[S - c[i].second];
}
cout << res << endl;
return 0;
}
** 在编译的时候没有问题 但导入时有问题 **