Cod sursa(job #766572)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int N=105;
int n,l;
struct point
{
int a,b,poz;
};
point x[N],rez[N];
bool cmp(point x, point y)
{
return x.a-x.b < y.a-y.b;
}
bool ok(int t)
{
int la=0,lb=0,k,i;
k=1;
for(i=1;i<=n;i++)
rez[i].a=rez[i].b=0;
while(k<=n && la<l)
{
if(la+t/x[k].a>=l)
{
rez[x[k].poz].a=l-la;
lb=(t-(l-la)*x[k].a)/x[k].b;
rez[x[k].poz].b=lb;
k++;
break;
}
la+=t/x[k].a;
rez[x[k].poz].a=t/x[k].a;
k++;
}
while(k<=n && lb<l)
{
lb+=t/x[k].b;
rez[x[k].poz].b=t/x[k].b;
k++;
}
if(lb>=l)
return true;
return false;
}
int bs()
{
int i,pas=1<<13;
for(i=1;pas;pas>>=1)
{
if(!ok(i+pas))
i+=pas;
}
return i+1;
}
int main()
{
int i,t;
in>>n>>l;
for(i=1;i<=n;i++)
{
in>>x[i].a>>x[i].b;
x[i].poz=i;
}
sort(&x[1],&x[n+1],cmp);
t=bs();
out<<t<<"\n";
i=ok(t);
for(i=1;i<=n;i++)
out<<rez[i].a<<" "<<rez[i].b<<"\n";
return 0;
}