#include #include #include using namespace std; #define FORC( it, C ) for( __typeof( (C).begin() ) it = (C).begin(); it != (C).end(); ++it ) const int NULA = 0; #define isalpha( c ) ( c >= 'A' && c <= 'Z' ) set< char > _znakovi; int n; char znakovi[10]; char A[10], B[10], C[10]; char medju[10][10]; char linija[102]; int _A, _B, _C, _D; bool uzeo[ 10 ]; int broj[10]; int lookup[256]; char maska[20]; inline void pripremi( void ) { memset( lookup, 1, sizeof( lookup ) ); for( int i = 0; i < 10; ++i ) lookup[i+'0'] = i; } inline void dodaj( char *S ) { for( int i = 0; S[i]; ++i ) if( isalpha( S[i] ) ) _znakovi.insert( S[i] ); else uzeo[S[i]-'0'] = 1; } inline void ucitaj( void ) { pripremi(); scanf( " %[^*]*%[^\n] %s", A, B, linija ); dodaj( A ); dodaj( B ); for( int i = 0; B[i]; ++i ) { scanf( " %s", medju[i] ); dodaj( medju[i] ); } scanf( " %*s %s", C ); dodaj( C ); FORC( it, _znakovi ) znakovi[ n++ ] = *it; } #define daj( c ) ( ( c >= '0' && c <= '9' ) ? ( c - '0' ) : lookup[c] ) inline int prevedi( char *S ) { int ret = 0; for( int i = 0; S[i]; ++i ) ret = ret * 10 + daj( S[i] ); return ret; } inline void output( void ) { printf( " %d*%d\n%s\n", prevedi( A ), prevedi( B ), linija ); int l = strlen( A ); sprintf( maska, "%%%dd\n", l+1 ); for( int i = 0; B[i]; ++i ) { for( int j = 0; j < i; ++j ) printf( " " ); printf( maska, prevedi( medju[i] ) ); } printf( "%s\n", linija ); if( C[l+strlen(B)-1] == 0 ) printf( " " ); printf( "%d\n", prevedi( C ) ); } inline bool provjeri( void ) { _A = prevedi( A ); _B = prevedi( B ); _C = prevedi( C ); if( _A * _B != _C ) return 0; for( int i = 0; B[i]; ++i ) { _D = prevedi( medju[i] ); if( _A * daj( B[i] ) != _D ) return 0; } return 1; } inline bool rjesi( int koji ) { if( koji == n ) { if( provjeri() ) { output(); return 0; } return 0; } for( int i = 0; i < 10; ++i ) { if( uzeo[i] ) continue; uzeo[i] = 1; broj[koji] = i; lookup[znakovi[koji]] = i; if( rjesi( koji + 1 ) ) return 1; uzeo[i] = 0; } return 0; } int main( void ) { ucitaj(); rjesi( 0 ); return NULA; }