STL版
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#define int long long
using namespace std;
const int N = 40;
set<int> sf, sb;
vector<int> v;
int f[N];
int n, m;
int ans;
void DFS_Front(int u, int w) {
if (u == n >> 1) {
sf.insert(w);
return;
}
DFS_Front(u + 1, w);
DFS_Front(u + 1, (w + f[u + 1]) % m);
}
int bs(int t) {
int l = 0, r = v.size() - 1;
if (r < 0) return 0;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (v[mid] < t) l = mid;
else r = mid - 1;
}
return v[l] < t ? v[l] : 0;
}
void DFS_Back(int u, int w) {
if (u == n) {
sb.insert(w);
ans = max(ans, w + bs(m - w));
return;
}
DFS_Back(u + 1, w);
DFS_Back(u + 1, (w + f[u + 1]) % m);
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> f[i];
DFS_Front(0, 0);
v.assign(sf.begin(), sf.end());
DFS_Back(n >> 1, 0);
ans = max(ans, (*sf.rbegin() + *sb.rbegin()) % m);
cout << ans << endl;
return 0;
}
纯数组版
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
const int N = 40;
const int M = 1 << 18;
int sf[M], sfc;
int sb[M], sbc;
int f[N];
int n, m;
int ans;
void DFS_Front(int u, int w) {
if(u == n >> 1) {
sf[sfc++] = w;
return;
}
DFS_Front(u + 1, w);
DFS_Front(u + 1, (w + f[u + 1]) % m);
}
int bs(int t) {
int l = 0, r = sfc - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (sf[mid] < t) l = mid;
else r = mid - 1;
}
return sf[l] < t ? sf[l] : 0;
}
void DFS_Back(int u, int w) {
if(u == n) {
sb[sbc++] = w;
ans = max(ans, w + bs(m - w));
return;
}
DFS_Back(u + 1, w);
DFS_Back(u + 1, (w + f[u + 1]) % m);
}
signed main () {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> f[i];
DFS_Front(0, 0);
sort(sf, sf + sfc);
sfc = unique(sf, sf + sfc) - sf;
DFS_Back(n >> 1, 0);
sort(sb, sb + sbc);
ans = max(ans, (sf[sfc - 1] + sb[sbc - 1]) % m);
cout << ans;
return 0;
}