#include #include using namespace std; using namespace atcoder; typedef modint998244353 mint; typedef long long ll; // importbisect template int bisect_left(vector &X, T v){ return lower_bound(X.begin(), X.end(), v) - X.begin(); } template int bisect_right(vector &X, T v){ return upper_bound(X.begin(), X.end(), v) - X.begin(); } // ----- vector ju(int n, vector &a, int k){ if (k <= 0) return {0}; vector ret = ju(n, a, k-1); for (int i=0; i 1){ vector tmp = ju(n, a, k-1); for (int j=0; j<(int)tmp.size(); j++){ ret.push_back(a[i] + tmp[j]); } }else{ ret.push_back(a[i]); } } sort(ret.begin(), ret.end()); return ret; } int main(){ int n; ll m; int k; cin >> n >> m >> k; vector a(n); for (int i=0; i> a[i]; } if (k <= 3){ vector ret = ju(n, a, k); int f = bisect_right(ret, m) - 1; cout << ret[f] << endl; }else{ vector ret1 = ju(n, a, 3); vector ret2 = ju(n, a, k-3); ll ans = 0; for (ll t: ret2){ int f = bisect_right(ret1, m - t) - 1; if (f >= 0){ ans = max(ans, ret1[f] + t); } } cout << ans << endl; } }