#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
Trimiteți un comentariu