Cod sursa(job #199942)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 21 iulie 2008 14:03:01
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#define IN "shop.in"
#define OUT "shop.out"
#define FOR(i,a,b) for(ll i=a;i<=b;++i)
#define ll long long

ll N,C,L;
ll p[50],v[50];
ll sol[50];

void scan()
{
	ll x,y;
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%lld%lld%lld", &N,&C,&L);
	FOR(i,1,40)
		v[i] = -1;
	FOR(i,1,N)
		scanf("%lld%lld", &x,&y),
		v[x] = y,
		p[x] = i;
	sol[0] = N;	
}

inline ll pow(ll x,ll y)
{
	ll rez=1;
	for(;y>0;y/=2)  
    {  
		if( y%2 ) 
			rez *= x;  
		x *= x;  
    }  
    return rez;	
}

void solve()
{
	FOR(ii,1,40)
	{
		ll i=40-ii;
		if(v[i] == -1)
			continue;
		
		//printf("pt %d la puterea :%d  = %d    poz - %d\n",i,v[i],v[i] * pow(C,i),p[i] ); 
		ll j=v[i];
		FOR(jj,0,v[i])
			if( (jj + 1) * pow(C,i) > L)
			{
				j = jj;
				break;
			}	
		sol[ p[i] ] = j;
		if(j)
			L -= j * pow(C,i);
	}
	
	ll suma=0;
	
	FOR(i,1,N)
		suma += sol[i];
	printf("%lld\n",suma); 	
	FOR(i,1,N)
		printf("%lld ", sol[i]);
}

int main()
{
	scan();
	solve();
	return 0;
}