/*
* Problema nu e chiar atat de simpla pe cat pare, totusi se poate obtine
* matematic o complexitate amortizata O(140).
* La prima vedere se observa ca sirul contine secvente de numere unde
* secventa[i] contine aceleasi numere ca si secventa[i-1] + X unde
* X reprezinta dimensiunea+1 a secventei i-1, practic la fiecare secventa
* se adauga in plus fata de penultima un numar mai mare cu 1 fata de ultimul adaugat.
*
* Lungimea unui sir format din subsecvente complete este suma lungimilor fiecarei
* subsecvente: 1 + 2 + 3 + ... + N respectiv N(N+1)/2.
* Sa zicem ca avem K=3 (lungimea sirului) si vrem sa aflam N (lungimea ultimei subsecvente).
* Atunci N(N+1)/2=K devine N^2/2+N/2=K mai exact avem ecuatia 0.5N^2+0.5N-K=0.
* Rezolvam ecuatia cu ajutorul subprogramului si vedem ca N=2 pentru K=3
* deci lungimea ultimei subsecvente este 2 adica avem sirul: (1)(12) iar N e ultimul termen.
* Stiind N stim si ultimul termen din subsecventa (care este egal cu N) astfel
* aflam si ce termen avem pe pozitia K (pozitie pentru care N este radacina intreaga)
* dar nu pentru orice K vom avea solutii intregi, asa ca tot aflam radacina pozitiva
* pana cand ea apartine lui [N]*, decrementand pe K. In momentul asta stim ca elementul
* de pe noul K este chiar radacina, dar de la vechiul K s-a ajuns la noul K
* decrementand de Z ori, deci Z este numarul cautat pentru ca se pleaca de la sfarsitul
* ultimei subsecvente complete de dimensiunea noului K.
*/
#include <stdio.h>
#include <math.h>
#define RET -32000
float Ecuatie(float a, float b, float c)
{
/// Calculeaza radacina maxima a unei ecuatii de gradul 2.
float del = b * b - 4 * a * c;
if (del < 0) return RET; // solutii complexe
float x1
= (sqrt(del
) - b
) / (2 * a
); float x2 = c / a / x1; // bunicu' Viete
//fprintf(stdout, "%f %f\n", x1, x2);
x1 = x1 > x2 ? x1 : x2;
if (x1 < 0) return RET; // ambele negative
return x1;
}
int main()
{
/**
* Citim `k`.
* Il decrementam progresiv pana gasim solutie intreaga.
* Vedem de la ce numar am plecat.
* Il afisam, acesta apartinandu-i pozitiei `k`.
*/
int k, cnt;
for (scanf("%d", &k
), cnt
= 0; 1; --k
, ++cnt
) { float res = Ecuatie(0.5, 0.5, -k);
if (res == RET) continue; // invalid root
if (res - (int)res == 0.0) { // daca avem radacina intreaga
// `k` reprezinta indexul unui ultimul element dintr-o serie
if (!cnt) cnt = res; // daca avem serii complete atunci afisam dimensiunea ultimei serii
printf("Elementul `k`: %d\n", cnt
); break;
}
}
return 0;
}