Pagini recente » Cod sursa (job #3001698) | Cod sursa (job #981291) | Cod sursa (job #1328968) | Cod sursa (job #2401954) | Cod sursa (job #21366)
Cod sursa(job #21366)
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N_MAX = 300010;
const int P_MAX = 23;
const int K_MAX = 8;
int is[P_MAX][K_MAX], is2[P_MAX][K_MAX], ex[P_MAX][K_MAX];
int v2[N_MAX], v[P_MAX * K_MAX], ct[P_MAX];
int main()
{
freopen("tricouri.in", "r", stdin);
freopen("tricouri.out", "w", stdout);
int N, M, K, P, j, k, i, nr, sum, S, mx;
scanf("%d %d\n", &N, &M);
for (i = 1; i <= N; i ++) {
scanf("%d ", &v2[i]);
}
sort(v2 + 1, v2 + N + 1);
for (i = N; i >= 1; i --) {
if (ct[v2[i] % P] < 5) {
ct[v2[i] & P] ++;
} else {
v2[i] = -1;
}
}
for (i = 1; i <= N; i ++) {
if (v2[i] != -1) {
v[++ v[0]] = v2[i];
}
}
N = v[0];
for (; M; M --) {
scanf("%d %d\n", &K, &P);
for (i = 0; i <= P; i ++) {
memset(is[i], 0, sizeof(is[i]));
memset(ex[i], 0, sizeof(ex[i]));
}
S = v[1] % P;
is[v[1] % P][1] = v[1];
ex[v[1] % P][1] = 1;
is[v[1] % P][0] = 1;
for (i = 2; i <= N; i ++) {
nr = v[i] % P;
if (v[i] > is2[nr][1]) {
is2[nr][1] = v[i];
is2[nr][0] = 1;
}
mx = S;
for (j = S; j >= 0; j --) {
if (is[j][0]) {
sum = (j + nr) % P;
if (sum > S) {
mx = sum;
}
for (k = K; k >= 1; k --) {
if (k + 1 <= K && ex[j][k]) {
if (i == N) {
}
if (is[j][k] + v[i] > is2[sum][k + 1]) {
is2[sum][k + 1] = is[j][k] + v[i];
is2[sum][0] = 1;
}
}
}
}
}
S = mx;
for (j = 0; j <= P; j ++) {
for (k = 0; k <= K; k ++) {
if (is2[j][k] > is[j][k]) {
is[j][k] = is2[j][k];
ex[j][k] = 1;
}
is2[j][k] = 0;
}
}
}
if (is[0][K]) {
printf("%d\n", is[0][K]);
} else {
printf("-1\n");
}
}
return 0;
}