Se dă un număr natural n
şi un interval [a,b]
. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe n
ca sumă de numere naturale din intervalul [a,b]
.
Date de intrare
Fişierul de intrare partitiinumar3.in
conţine pe prima linie numerele n
, a
şi b
.
Date de ieşire
Fişierul de ieşire partitiinumar3.out
va conţine pe pe fiecare linie câte un şir de numere naturale din intervalul [a,b]
, ordonate crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este n
. Şirurile vor fi afişate în ordine lexicografică.
Restricţii şi precizări
1 ≤ a < b < n ≤ 40
Exemplu
partitiinumar3.in
10 2 4
partitiinumar3.out
2 2 2 2 2 2 2 2 4 2 2 3 3 2 4 4 3 3 4
#include <fstream> #include <iostream> using namespace std; int st[1000], n, a, b; ifstream fin("partitiinumar3.in"); ofstream fout("partitiinumar3.out"); int minim(int x, int y){ return x<y ? x : y; } void afisare(int k){ for(int i=1;i<=k;++i) fout << st[i] << " "; fout << '\n'; } void back(int k, int s){ for(int i=st[k-1] ; i<= minim(n-s,b) ; ++i) { st[k]=i; if(s+st[k]<=n) if( s+st[k] == n ) afisare(k); else back(k+1, s+st[k]); } } int main(){ fin >> n >> a >> b; st[0] = a; back(1,0); return 0; }