Pagini recente » Cod sursa (job #2135086) | Cod sursa (job #1047893) | Cod sursa (job #253713) | Cod sursa (job #1135621) | Cod sursa (job #1760836)
#include <cstdio>
#include <algorithm>
using namespace std;
struct mon{
int ap, sol, i;
long long val;
}v[35];
long long lgpow(long long b, long long e){
long long sol = 1;
while(e){
if(e&1){
sol *= b;
}
b *= b;
e >>= 1;
}
return sol;
}
int binarySearch(long long s, long long id, long long L){
long long step;
long long n = v[id].ap;
long long i;
for(step = 1;step <= n;step <<= 1);
for(i = s - 1;step;step >>= 1){
if(i + step <= n && (i + step) * v[id].val <= L){
i += step;
}
}
return i;
}
bool comp(mon m1, mon m2){
return m1.val < m2.val;
}
bool comp2(mon m1, mon m2){
return m1.i < m2.i;
}
int main()
{
freopen("shop.in", "r", stdin);
freopen("shop.out", "w", stdout);
long long N,C,L,i,x,y;
scanf("%lld %lld %lld", &N, &C, &L);
for(i = 1;i <= N;i++){
scanf("%lld %lld", &x, &v[i].ap);
v[i].val = lgpow(C, x);
v[i].i = i;
}
sort(v+1, v+N+1, comp);
long long uses,ans;
ans = 0;
for(i = N;L;i--){
if(v[i].val > L){
continue;
}
uses = binarySearch(1, i, L);
L -= uses*v[i].val;
v[i].sol += uses;
ans += v[i].sol;
}
printf("%lld\n", ans);
sort(v+1, v+N+1, comp2);
for(i = 1;i <= N;i++){
printf("%d ", v[i].sol);
}
return 0;
}