Cod sursa(job #177822)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxl 201
long L, n, sal[maxl + 1][maxl + 1], v[101][2], last[101][maxl + 1][maxl + 1][2], sool[101][2];
void show(long a, long b, long c) {
long i;
while(c > 0) {
sool[c][0] = last[c][a][b][0];
sool[c][1] = last[c][a][b][1];
a = a - sool[c][0];
b = b - sool[c][1];
--c;
}
for (i = 1;i <= n; ++i) {
printf("%ld %ld\n", sool[i][0], sool[i][1]);
}
}
long sol(long a, long b) {
long i, k, j, l;
memset(sal, 0, sizeof(sal));
sal[0][0] = 1;
for (k = 1; k <= n; ++k) {
for (i = L + 10;i >= 0; --i) {
for(j = L + 10;j >= 0; --j) {
if(sal[i][j]) {
long st =0;
long dr = a / v[k][0];
if (i >= L) {
dr = 0;
}
if (j >= L) {
st = dr;
}
for (l = st; l <= dr; ++l) {
sal[i + l][j + (a - l * v[k][0]) / v[k][1]] = 1;
last[k][i + l][j + (a - l * v[k][0]) / v[k][1]][0] = l;
last[k][i + l][j + (a - l * v[k][0]) / v[k][1]][1] = (a - l * v[k][0]) / v[k][1];
if (i + l >= L && j + (a - l * v[k][0]) / v[k][1] >= L) {
if(b==0) {
return 1;
} else {
show(i + l,j + (a - l * v[k][0]) / v[k][1], k);
return 1;
}
}
}
}
}
}
}
return 0;
}
long cautab(long a, long b) {
if (a == b) {
return a;
}
long mij = (a + b) / 2;
if (sol(mij, 0)) {
return cautab(a, mij);
} else {
return cautab(mij + 1, b);
}
}
int main() {
long x, i;
freopen("lapte.in","rt",stdin);
freopen("lapte.out","wt",stdout);
scanf("%ld %ld", &n, &L);
for (i = 1;i <= n; ++i) {
scanf("%ld %ld", &v[i][0], &v[i][1]);
}
x = cautab(1, 90);
printf("%ld\n", x);
sol(x, 1);
return 0;
}