#include<bits/stdc++.h>
using namespace std;

using ui=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;

void solve()
{//其他题解中把转移方程讲解的很透彻 我就不再赘述
//但是我发现都没有讲一个萌新比较疑惑的点吧 为什么dp的初始值要设置成极小值
//其实 当设置成极小值时 代表这个点不可达 为什么不可达呢
//dp[i][j] 表示从前i个数中挑选一部分数的和对k取模余数为j的最大值
//那么当i为0时 和为0 对k取模肯定是0 所以dp[i][1]到dp[i][k-1]的值都要设置成不合法 只有dp[0][0]是合法的
	ll n,k;
	cin >> n >> k;
	vector<ll>a(n+1,0);
	for(int i=1;i<=n;i++) cin >> a[i];
	vector<vector<ll>>dp(n+1,vector<ll>(k,-1e18));
	dp[0][0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<k;j++)
		{
			dp[i][(j+a[i])%k]=max(dp[i-1][(j+a[i])%k],dp[i-1][j]+a[i]);
		}
	}
	if(dp[n][0]>0) cout << dp[n][0];
    else cout << -1;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t=1;
	//cin >> t;

	while(t--)
	{
		solve();
	}
	return 0;
}