#include <iostream>

 

using namespace std;

 

const int VALMAX = 1000000;

 

bool atins[1 + VALMAX];

int last[1 + VALMAX];

 

int a, b;

 

int frecvA = 0;

int frecvB = 0;

 

void restaurareSolutie(int poz)

{

    if (poz == -1)

        return;

 

    if (poz - last[poz] == a)

        frecvA++;

    else if (poz - last[poz] == b)

        frecvB++;

 

    restaurareSolutie(last[poz]);

}

 

int main()

{

    int n;

    cin >> n >> a >> b;

 

    atins[0] = true;

    last[0] = -1;

 

    for (int i = 0; i <= n; i++)

    {

        if (atins[i])

        {

            if (i + a <= n)

            {

                atins[i + a] = true;

                last[i + a] = i;

            }

        }

    }

 

    for (int i = 0; i <= n; i++)

    {

        if (atins[i])

        {

            if (i + b <= n && !atins[i + b])

            {

                atins[i + b] = true;

                last[i + b] = i;

            }

        }

    }

 

    restaurareSolutie(n);

 

    for (int i = 1; i <= frecvA; i++)

        cout << a << ' ';

    for (int j = 1; j <= frecvB; j++)

        cout << b << ' ';

    cout << '\n';

 

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

40 3 5

 

atins[0]   last[0]   atins[1]   last[1]   atins[2]   last[2]   atins[2]   last[2]   atins[3]   last[3]   atins[4]   last[4]

true        -1           false        0            false        0            false         0            true         0            false        0

atins[5]   last[5]   atins[6]   last[6]   atins[7]   last[7]   atins[8]   last[8]   atins[9]   last[9]

 true        0            true         3            false        0             true         3             true         6

atins[10]   last[10]   atins[11]   last[11]   atins[12]   last[12]   atins[13]   last[13]   atins[14]   last[14]

 true          5              true           6               true           9              true           8               true           9

atins[15]   last[15]   atins[16]   last[16]   atins[17]   last[17]   atins[18]   last[18]   atins[19]   last[19]

 true          12            true           11            true           12            true          15              true           14

atins[20]   last[20]   atins[21]   last[21]   atins[22]   last[22]   atins[23]   last[23]   atins[24]   last[24]

 true          15            true           18            true           17             true          18             true           21   

atins[25]   last[25]   atins[26]   last[26]   atins[27]   last[27]   atins[28]   last[28]   atins[29]   last[29]

 true          20             true           21            true           24            true           23            true            24                                                                                                           

atins[30]   last[30]   atins[31]   last[31]   atins[32]   last[32]   atins[33]   last[33]   atins[34]   last[34]

 true          27             true           26            true           27            true           30            true            29                                                                            

atins[35]   last[35]   atins[36]   last[36]   atins[37]   last[37]   atins[38]   last[38]   atins[39]   last[39]

true           30             true           33            true           32            true           33            true           36

atins[40]   last[40]

true           35

Am apelat în main() restaurareSolutie(40), cu poz=40. 40≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 5≠3=>40-35≠3=>40-last[40]≠3=>poz-last[poz]≠a. Nu intrăm în al doilea if (nu s-a respectat condiția). 5=5=>40-35=5=>40-last[40]=5=>poz-last[poz]=b. Intrăm în else (s-a respectat condiția). frecvB=0+1=1. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[40])=restaurareSolutie(35).

Am apelat în restaurareSolutie(40) restaurareSolutie(35), cu poz=35. 35≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 5≠3=>35-30≠3=>35-last[35]≠3=>poz-last[poz]≠a. Nu intrăm în al doilea if (nu s-a respectat condiția). 5=5=>35-30=5=>35-last[35]=5=>poz-last[poz]=b. Intrăm în else (s-a respectat condiția). frecvB=1+1=2. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[35])=restaurareSolutie(30).

Am apelat în restaurareSolutie(35) restaurareSolutie(30), cu poz=30. 30≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>30-27=3=>30-last[30]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=0+1=1. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[30])=restaurareSolutie(27).

Am apelat în restaurareSolutie(30) restaurareSolutie(27), cu poz=27. 27≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>27-24=3=>27-last[27]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=1+1=2. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[27])=restaurareSolutie(24).

Am apelat în restaurareSolutie(27) restaurareSolutie(24), cu poz=24. 24≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>24-21=3=>24-last[24]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=2+1=3. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[24])=restaurareSolutie(21).

Am apelat în restaurareSolutie(24) restaurareSolutie(21), cu poz=21. 21≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>21-18=3=>21-last[21]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=3+1=4. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[21])=restaurareSolutie(18).

Am apelat în restaurareSolutie(21) restaurareSolutie(18), cu poz=18. 18≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>18-15=3=>18-last[18]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=4+1=5. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[18])=restaurareSolutie(15).

Am apelat în restaurareSolutie(18) restaurareSolutie(15), cu poz=15. 15≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>15-12=3=>15-last[15]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=5+1=6. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[15])=restaurareSolutie(12).

Am apelat în restaurareSolutie(15) restaurareSolutie(12), cu poz=12. 12≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>12-9=3=>12-last[12]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=6+1=7. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[12])=restaurareSolutie(9).

Am apelat în restaurareSolutie(12) restaurareSolutie(9), cu poz=9. 9≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>9-6=3=>9-last[9]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=7+1=8. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[9])=restaurareSolutie(6).

Am apelat în restaurareSolutie(9) restaurareSolutie(6), cu poz=6. 6≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>6-3=3=>6-last[6]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=8+1=9. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[6])=restaurareSolutie(3).

Am apelat în restaurareSolutie(6) restaurareSolutie(3), cu poz=3. 3≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 3=3=>3-0=3=>3-last[3]=3=>poz-last[poz]=a. Intrăm în al doilea if (s-a respectat condiția). frecvA=9+1=10. Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[3])=restaurareSolutie(0).

Am apelat în restaurareSolutie(3) restaurareSolutie(0), cu poz=0. 0≠-1=>poz≠-1. Nu intrăm în primul if (nu s-a respectat condiția). 1≠3=>0-(-1)≠3=>0-last[0]≠3=>poz-last[poz]≠a. Nu intrăm în al doilea if (nu s-a respectat condiția). 1≠5=>0-(-1)≠5=>0-last[0]≠5=>poz-last[poz]≠b. Nu intrăm în else (nu s-a respectat condiția). Apelăm restaurareSolutie(last[poz])=restaurareSolutie(last[0])=restaurareSolutie(-1).

Am apelat în restaurareSolutie(0) restaurareSolutie(-1), cu poz=-1. -1=-1=>poz=-1. Intrăm în primul if (s-a respectat condiția). Încheiem apelul restaurareSolutie(-1). Ne întoarcem cu un apel, la restaurareSolutie(0). Am încheiat apelul restaurareSolutie(0). Ne întoarcem cu un apel, la restaurareSolutie(3). Am încheiat apelul restaurareSolutie(3). Ne întoarcem cu un apel, la restaurareSolutie(6). Am încheiat apelul restaurareSolutie(6). Ne întoarcem cu un apel, la restaurareSolutie(9). Am încheiat apelul restaurareSolutie(9). Ne întoarcem cu un apel, la restaurareSolutie(12). Am încheiat apelul restaurareSolutie(12). Ne întoarcem cu un apel, la restaurareSolutie(15). Am încheiat apelul restaurareSolutie(15). Ne întoarcem cu un apel, la restaurareSolutie(18). Am încheiat apelul restaurareSolutie(18). Ne întoarcem cu un apel, la restaurareSolutie(21). Am încheiat apelul restaurareSolutie(21). Ne întoarcem cu un apel, la restaurareSolutie(24). Am încheiat apelul restaurareSolutie(24). Ne întoarcem cu un apel, la restaurareSolutie(27). Am încheiat apelul restaurareSolutie(27). Ne întoarcem cu un apel, la restaurareSolutie(30). Am încheiat apelul restaurareSolutie(30). Ne întoarcem cu un apel, la restaurareSolutie(35). Am încheiat apelul restaurareSolutie(35). Ne întoarcem cu un apel, la restaurareSolutie(40). Am încheiat apelul restaurareSolutie(40).  

3 3 3 3 3 3 3 3 3 3 5 5

Comentarii

Postări populare de pe acest blog

Argument