给定n个整数, 从中选出若干个数字(每个数字最多选一次),使得它们的和取余m最大,求最大的余数。
输入
第一行输入两个整数n(1 le n le 35)n(1≤n≤35)和m(1 le m le 10^9)m(1≤m≤109)。
第二行输入n个整数,这些整数属于区间[1, 10^9][1,109]。
输出
输出一个整数作为答案。
样例
输入
复制
4 4 5 2 4 1
输出
复制
3
输入
复制
3 20 199 41 299
输出
复制
19
输入
复制
2 10 2 2
输出
复制
4
提示
子任务1,40分,1 le n le 161≤n≤16
子任务2,60分,1 le n le 351≤n≤35
#include <iostream> #include <cstdio> #include <vector> #include <set> #define MAX 40 using namespace std; int main() { int n, m; int d; int ans = 0; scanf("%d %d", &n, &m); int n1 = (n + 1) / 2; std::set<int> s[2]; s[0].insert(0); s[1].insert(0); for (int i = 0; i < n; i++) { scanf("%d", &d); int flag = i >= n1; std::vector<int> temp; for (const int& num : s[flag]) { temp.push_back((d + num) % m); } for (int& num : temp) { s[flag].insert(num); } } std::set<int>::reverse_iterator it = s[1].rbegin(); for (auto& num : s[0]) { while (it != s[1].rend() && num + *it >= m) { it++; } if (ans < (num + *it) % m) { ans = (num + *it) % m; } } printf("%d", ans); }