Pagini recente » Cod sursa (job #670661) | Cod sursa (job #681688) | Cod sursa (job #2567662) | Cod sursa (job #1231132) | Cod sursa (job #45163)
Cod sursa(job #45163)
#include <stdio.h>
#define in "shop.in"
#define out "shop.out"
#define NMAX 31
#define INF (-1)*(1<<15)
#define minim( a, b ) ( (a) < (b) ? (a) : (b) )
int n, C;
long long suma;
long long L;
long long maxim;
long long a[NMAX];
int sol[NMAX], nr[NMAX], sel[NMAX];
long long putere( int a, long long b );
void Read();
void Solve();
FILE *fout = fopen ( out, "w" );
int main()
{
Read();
Solve();
fclose ( fout );
return 0;
}
void Read()
{
FILE *fin = fopen ( in, "r" );
fscanf( fin, "%d%d%lld", &n, &C, &L );
int i;
for ( i = 1; i <= n; ++i )
{
fscanf( fin, "%lld%d", &a[i], &nr[i] );
}
fclose( fin );
}
long long putere( int a, long long b )
{
if ( b == 0 ) return 1;
if ( b == 1 ) return a;
if ( (b&1) == 0 ) return putere( a, (b>>1) ) * putere ( a, (b>>1) );
if ( (b&1) == 1 ) return putere ( a, (b>>1) ) * putere ( a, (b>>1) ) * a;
}
void Solve()
{
int i;
for ( i = 1; i <= n; ++i )
{
a[i] = putere( C, a[i] );
}
/*for ( i = 1; i <= n; ++i )
fprintf( fout, "%d ", a[i] );*/
long long LL = L;
int count;
int ok = 0;
while ( LL )
{
maxim = INF;
for ( i = 1; i <= n; ++i )
{
if ( !sel[i] && a[i] > maxim )
{
ok = i, maxim = a[i];
}
}
sel[ok] = 1;
count = 0;
count = minim( LL/a[ok], nr[ok] );
sol[ok] = count;
suma += sol[ok];
LL -= a[ok] * count;
}
fprintf( fout, "%lld\n", suma );
for ( i = 1; i <= n; ++i )
fprintf( fout, "%d ", sol[i] );
}