Ca în mai toate poveștile, Făt-Frumos a căutat o Cosânzeană și a găsit-o, dar tatăl ei i-a cerut să-i paveze drumul de lungime N
care leagă castelele sale. Dalele cu care va pava drumul au aceeași lățime (egală cu lățimea drumului) și lungimi numere naturale. Fiind un împărat cam sâcâit, acesta dorește ca pavarea să se facă folosind un număr minim de dale, diferența de lungime între două dale vecine să nu fie mai mare ca 1
, iar prima și ultima dală să fie de lungime 1
. Împăratul nu se mulțumește să primească de la Făt-Frumos doar un număr (numărul minim de dale necesare): el vrea și posibilitatea de pavare cea mai mică din punct de vedere lexicografic.
Compararea lexicografică a două șiruri de numere este o extensie la numere a comparării alfabetice a două cuvinte. Astfel, fiind date două șiruri numerice de aceeași lungime, A
1
, A
2
, … A
m
și B
1
, B
2
, … B
m
, acestea sunt egale dacă și numai dacă A
i
= B
i
pentru orice i
de la 1
la m
. Șirul A
este mai mic lexicografic decât șirul B
dacă există o valoare k
astfel încât A
k
<B
k
și A
i
=B
i
pentru orice i
de la 1
la k-1
. De exemplu, șirul 3, 5, 4, 1
este mai mare lexicografic decât șirul 3, 5, 2, 9
pentru că prima poziție pe care valorile diferă este poziția 3
(4>2
), fără a mai conta valorile aflate după aceasta.
Cerință
Cunoscând lungimea drumului, determinați numărul minim de dale necesare pavării și posibilitatea de pavare cu număr minim de dale, care este cea mai mică din punct de vedere lexicografic.
Date de intrare
Fișierul de intrare pavare1.in
conține pe prima linie un număr natural V
. Linia a doua conține un număr natural N
ce reprezintă lungimea drumului.
Date de ieșire
Dacă V
va avea valoarea 1
, în fișierul pavare1.out
se va scrie, pe prima linie, doar numărul minim de dale necesare pavării.
Dacă V
va avea valoarea 2
, în fișierul pavare1.out
se va scrie, pe prima linie, un șir de numere separate prin câte un spațiu, ce reprezintă soluția de pavare a drumului, folosind un număr minim de dale, care este cea mai mică din punct de vedere lexicografic.
Restricții și precizări
V
poate fi1
sau2
1 ≤ N ≤ 1000 000 000
- Pentru 30% din punctaj
V = 1
.
Exemplul 1
pavare1.in
1 7
pavare1.out
5
Explicație
Pentru drumul de lungime 7
sunt necesare 5
dale.
Exemplul 2
pavare1.in
2 7
pavare1.out
1 1 2 2 1
Explicație
Soluțiile cu număr minim de dale sunt: (1 1 2 2 1)
, (1 2 1 2 1)
, (1 2 2 1 1)
.
#include <bits/stdc++.h> using namespace std; long long val , n , r , x; ifstream cin("pavare1.in"); ofstream cout("pavare1.out"); int main() { cin >> val >> x; r = (long long)((1 + sqrt(4*x))/2); if(x <= (r*(r-1) + r) ) { if(val == 1) {cout << r * 2 - 1 << "\n" ; return 0;} if (x == r*(r-1)) { for(int i = 1; i <= r - 1 ; i++) cout << i << " "; for(int i = r - 1 ; i >= 1 ; i--) cout << i << " "; } else { for(int i = 1 ; i <= (x - (r*(r-1))) ; i++)cout<<i<<" "; for(int i = (x - (r*(r-1))) ; i <= r - 1 ; i++) cout << i << " "; for(int i = r - 1 ; i >= 1 ; i--) cout << i << " "; } } else { if(val == 1) {cout << r * 2 << "\n" ; return 0;} long long k = x - (r*(r-1)) - r; for(int i = 1 ; i <= k ; i++) cout << i << " "; for(int i = k ; i <= r ; i++) cout << i << " "; for(int i = r - 1 ; i >= 1 ; i--) cout << i << " "; } return 0; }