Pagini recente » Cod sursa (job #154816) | Cod sursa (job #1575654) | Cod sursa (job #1214567) | Cod sursa (job #2178478) | Cod sursa (job #501855)
Cod sursa(job #501855)
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;
# define verf( X, i ) ( i <= X[0] ? X[i] : 0 )
# define A ( *this )
class Mare : protected vector < int > {
protected :
static const int base = 1000000000, nbase = 9 ;
public :
Mare ( ) ;
Mare& operator = ( const Mare& ) ;
void operator += ( Mare& ) ;
void operator -= ( Mare& ) ;
bool operator < ( Mare& ) ;
void operator = ( int ) ;
void operator = ( char* ) ;
void afis ( void ) ;
bool ac ( void ) ;
} ;
Mare :: Mare () {
this -> resize ( 50 ) ;
}
void Mare :: operator += ( Mare &B ) {
int i, t = 0;
for ( i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= base ) {
A[i] = ( t += verf ( A, i ) + verf ( B, i ) ) % base ;
}
A[0] = i - 1;
}
void Mare :: operator -= ( Mare &B ) {
int t = 0;
for ( int i = 1; i <= A[0]; ++i ) {
t = ( A[i] -= verf ( B, i ) + t ) < 0 ;
A[i] += t * base ;
}
for ( ; A[0] > 1 && !A[ A[0] ]; --A[0] ) ;
}
bool Mare :: operator < ( Mare &B ) {
if ( A[0] < B[0] ) return true;
else if ( A[0] > B[0] ) return false;
for ( int i = A[0]; i > 0 ; --i )
if ( A[i] < B[i] ) return true;
else if ( A[i] > B[i] ) return false;
return false;
}
void Mare :: operator = ( int X ) {
for ( A[0] = 0; X ; X /= base ) {
A[ ++A[0] ] = X % base ;
}
}
Mare& Mare :: operator = ( const Mare &B ) {
for ( int i = 0; i <= B[0]; ++i ) {
A[i] = B[i] ;
}
return A ;
}
void Mare :: operator = ( char *X ) {
A[0] = 0;
for ( int h = strlen ( X ) ; h > 0 ; h -= nbase ) {
++A[0] ;
for ( int i = max ( 0, h - nbase ) ; i < h; ++i ) {
A[ A[0] ] = A[ A[0] ] * 10 + X[i] - '0' ;
}
}
}
bool Mare :: ac ( void ) {
return ! ( A[0] == 1 && A[1] == 0 ) ;
}
void Mare :: afis ( void ) {
printf ( "%d", A[ A[0] ] ) ;
for ( int i = A[0] - 1; i ; --i ) {
printf ( "%09d", A[i] ) ;
}
printf ( "\n" ) ;
}
# undef A
Mare V[105][2], K ;
char ch[100] ;
int N, A, B ;
void write ( void ) {
freopen ( "pavare2.out", "w", stdout ) ;
Mare sol = V[N][0] ;
sol += V[N][1], sol.afis () ;
for ( int _1 = 0, _2 = 0 ; K.ac () && N ; ) {
if ( V[N][0] < K ) {
printf ( "1" ) ;
K -= V[N--][0], _1 = 0, ++_2 ;
} else {
printf ( "0" ) ;
--N, ++_1, _2 = 0 ;
}
if ( _1 ) {
V[N][0] = 0 ;
for ( int i = 1; i <= N && i <= A - _1; ++i ) {
V[N][0] += V[N - i][1] ;
}
} else {
V[N][1] = 0 ;
for ( int i = 1; i <= N && i <= B - _2; ++i ) {
V[N][1] += V[N - i][0] ;
}
}
}
}
int main ( void ) {
fscanf ( fopen ( "pavare2.in", "r" ), "%d %d %d %s", &N, &A, &B, ch ) ;
K = ch, V[0][1] = 1, V[0][0] = 1 ;
for ( int i = 1; i <= N; ++i ) {
for ( int j = 1; j <= A && j <= i; ++j ) {
V[i][0] += V[i - j][1] ;
}
for ( int j = 1; j <= B && j <= i; ++j ) {
V[i][1] += V[i - j][0] ;
}
}
write () ;
}