Cod sursa(job #334404)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_N 105
const int Tmax = 100;
struct lapte {int a, b, d, ord;} V[MAX_N];
int N, logT, L;
int SolA[MAX_N], SolB[MAX_N];
struct cmp
{
bool operator()(const lapte &a, const lapte &b) const
{
return a.d < b.d;
}
};
void citire()
{
scanf("%d %d",&N, &L);
for(int i = 1; i <= N; ++i)
{
scanf("%d %d",&V[i].a, &V[i].b);
V[i].d = V[i].a - V[i].b;
V[i].ord = i;
}
sort(V+1, V+N+1, cmp());
for(logT = 1; logT < Tmax; logT <<= 1);
}
int check(int k)
{
int La[MAX_N], Lb[MAX_N], ca(L), cb(L), T[MAX_N];
for(int i = 1; i <= N; ++i)
{
La[i] = min(k/V[i].a, ca);
ca -= La[i];
T[i] = k - La[i]*V[i].a;
}
for(int i = N; i; --i)
{
Lb[i] = min(T[i]/V[i].b, cb);
cb -= Lb[i];
}
return ((ca == 0) && (cb == 0));
}
void solve()
{
int i, lg;
for(i = Tmax, lg = logT; lg; lg >>= 1)
if(i - lg > 0 && check(i - lg))
i -= lg;
printf("%d\n",i);
int La[MAX_N], Lb[MAX_N], ca(L), cb(L), T[MAX_N], k = i;
for(int i = 1; i <= N; ++i)
{
La[V[i].ord] = min(k/V[i].a, ca);
ca -= La[V[i].ord];
T[i] = k - La[V[i].ord]*V[i].a;
}
for(int i = N; i; --i)
{
Lb[V[i].ord] = min(T[i]/V[i].b, cb);
cb -= Lb[V[i].ord];
}
for(int i = 1; i <= N; ++i)
printf("%d %d\n",La[i], Lb[i]);
}
int main()
{
freopen("lapte.in","rt",stdin);
freopen("lapte.out","wt",stdout);
citire();
solve();
}