#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int n, m;
ll maxVal = 0;
int vis[16], a[16];
//这题和之前的全排列有相似之处,这个是顺序遍历每个数字,每个数字选和不选,当遍历完就结算
//全排列是顺序遍历每个位置,每个位置不能选重复,遍历完结算
//对于排列的组合数是可以用快速幂的技巧求C(m, n)或A(m, n),但是要知道每种组合具体是什么需要搜索,复杂度o(2 ^ n)
void dfs(int deep, int *vis) {
if (n + 1 == deep) {
ll ans = 0;
for (int i = 1; i <= n; i++) {
ans += vis[i] ? a[i] : 0;
}
// cout << ans % m << " ";
maxVal = max(ans % m, maxVal);
return;
}
vis[deep] = 1;
dfs(deep + 1, vis);
vis[deep] = 0;
dfs(deep + 1, vis);
//回溯的部分
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
// cout << "Origin:" << maxVal;
dfs(1, vis);
cout << maxVal << endl;
// cout << "maxVal:" << maxVal << endl;
}
// 64 位输出请用 printf("%lld")