Cod sursa(job #1533015)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 21 noiembrie 2015 22:10:02
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include<fstream>
#include<cmath>

using namespace std;

ifstream fin( "ecuatie.in" ); ofstream fout( "ecuatie.out" );

int a, b, c, k;

void paranteza( int p1, int q1 ) {
    fout << "(";
    if ( p1 == 1 ) {
    } else if ( p1 == -1 ) {
        fout << "-";
    } else {
        fout << p1;
    }
    fout << "x";
    if ( q1 < 0 ) {
        fout << "-" << -q1;
    } else {
        fout << "+" << q1;
    }
    fout << ")";
}
void afis( int p1, int p2, int q1, int q2 ) {
    paranteza( p1, q1 ); paranteza( p2, q2 );
    fout << "\n";
}
void solve( int p1, int p2 ) {
    double q1, q2;

    if ( k == 0 ) return ;
    double delta = 1.0 * ( b * b - 4 * p2 * c * p1 );
    if ( delta < 0 ) return ;
    delta = sqrt( delta );
    if ( delta == 0 ) {
        q1 = ( 1.0 * b ) / ( 2.0 * p2 );
        q2 = ( 1.0 * c ) / q1;
        if ( q1 == ( int )q1 && q2 == ( int )q2 ) {
            -- k;
            if ( k == 0 ) {
                afis( p1, p2, ( int )q1, ( int )q2 );
            }
        }
    } else {
        q1 = ( 1.0 * b - delta ) / ( 2.0 * p2 );
        q2 = ( 1.0 * c ) / q1;
        if ( q1 == ( int )q1 && q2 == ( int )q2 ) {
            -- k;
            if ( k == 0 ) {
                afis( p1, p2, ( int )q1, ( int )q2 );
            }
        }

        q1 = ( 1.0 * b + delta ) / ( 2.0 * p2 );
        q2 = ( 1.0 * c ) / q1;
        if ( q1 == ( int )q1 && q2 == ( int )q2 ) {
            -- k;
            if ( k == 0 ) {
                afis( p1, p2, ( int )q1, ( int )q2 );
            }
        }
    }
}
int main() {
    int x;
    fin >> a >> b >> c >> k;

    if ( a < 0 ) {
        for( x = 1; x * x <= -a; ++ x ) {
            if ( a % x == 0 ) {
                solve( a / x, x );
            }
        }
        for( x = 1; x * x <= -a; ++ x ) {
            if ( a % x == 0 ) {
                solve( -x, -a / x );
            }
        }
    } else {
        for( x = 1; x * x < a; ++ x ) {
            if ( a % x == 0 )
                solve( -a / x, -x );
        }
        if ( x * x == a ) {
            solve( -x, -x );
            ++ x;
        }
        for( x = 1; x * x < a; ++ x ) {
            if ( a % x == 0 )
                solve( -x, -a / x );
        }

        for( x = 1; x * x < a; ++ x ) {
            if ( a % x == 0 )
                solve( x, a / x );
        }
        if ( x * x == a ) {
            solve( x, x );
            ++ x;
        }
        for( x = 1; x * x < a; ++ x ) {
            if ( a % x == 0 )
                solve( a / x, x );
        }
    }

    if ( k > 0 ) {
        fout << "-1\n";
    }
    fin.close();
    fout.close();
    return 0;
}