https://codeforces.com/contest/888/problem/E
一半枚举,一半二分,orz
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=50;
ll a[maxn],n,m;
int vis[40];
set<ll> s1,s2;
void dfs(set<ll>& s,int l,int r,int x){
if(x==r+1){
ll ans=0;
for(int i=l;i<=r;i++){
if(vis[i]){
ans=(ans+a[i]%m);
}
}
s.insert(ans%m);
return;
}
vis[x]=1;
dfs(s,l,r,x+1);
vis[x]=0;
dfs(s,l,r,x+1);
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),a[i]%=m;
int mid=n/2;
s1.insert(0),s2.insert(0);
if(1==n){
printf("%lld",a[1]);
return 0;
}
dfs(s1,1,mid,1);
dfs(s2,mid+1,n,mid+1);
set<ll>::iterator it,itt;
ll ans=0;
for(it=s1.begin();it!=s1.end();it++){
int temp=m-1-*it;
ans=max(ans,*it);
itt=s2.lower_bound(temp);
if(itt==s2.end()) itt--;
if(*itt>temp) itt--;
ans=max(ans,*itt+*it);
}
printf("%lld",ans);
return 0;
}