众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。
但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。
现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。
数据保证一定有解。
输入格式
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。
输出格式
输出一行一个整数代表所求的和。
数据范围
1≤n≤10^5,
1≤K≤10^3,
给定的 n 个数均不超过 10^8
输入样例:
4 3
1 2 3 4
输出样例:
9
代码如下:
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int f[4][N];
vector<int> a[N];
int main()
{
int n,m;
cin>>n>>m;
for (int i = 0;i<n;i++)
{
int x;
cin>>x;
a[x%m].push_back(x);
}
memset(f,-0x3f,sizeof(f));
f[0][0] = 0;
for (int i = 0;i<m;i++)
{
sort(a[i].begin(),a[i].end());
reverse(a[i].begin(),a[i].end());
for (int u = 0;u<3 &&u <a[i].size();u++)
{
int t = a[i][u];
for (int j = 3;j>=1;j--)
for (int k = 0;k<m;k++)
{
f[j][k] = max(f[j][k],f[j-1][((k-t)%m+m)%m]+t);
}
}
}
cout<<f[3][0]<<endl;
return 0;
}