CSES - Piirileikki

Piirissä on nn leikkijää, jotka on numeroitu 1,2,,n1,2,\dots,n. Vuoro kiertää piirissä ja joka toinen leikkijä lähtee pois, kunnes piiri on tyhjä. Tehtäväsi on selvittää järjestys, jossa leikkijät poistuvat.

Esimerkiksi kun n=7n=7, alkutilanne näyttää tältä:

Leikki alkaa leikkijästä 11 ja vuoro kiertää myötäpäivään. Ensin piiristä poistuu leikkijä 22 ja siitä eteenpäin joka toinen leikkijä. Tässä tapauksessa leikkijät poistuvat järjestyksessä [2,4,6,1,5,3,7][2,4,6,1,5,3,7].

Toteuta tiedostoon circlegame.py funktio find_order, jolle annetaan parametrina leikkijöiden määrä nn. Funktion tulee palauttaa listana poistumisjärjestys.

Funktiosi tulee toimia tehokkaasti myös suurilla nn:n arvoilla. Leikkijöiden poistaminen listan keskeltä olisi liian hidasta. Parempi tapa on esimerkiksi lisätä kierroksen aikana jäljelle jäävät leikkijät uuteen listaan.

Seuraavassa koodipohjassa viimeisessä testissä n=105n=10^5 ja näytetään viisi viimeistä poistujaa. Funktiosi tulee toimia tehokkaasti tässäkin tapauksessa.

def find_order(n):
    # TODO

if __name__ == "__main__":
    print(find_order(1)) # [1]
    print(find_order(2)) # [2, 1]
    print(find_order(3)) # [2, 1, 3]
    print(find_order(7)) # [2, 4, 6, 1, 5, 3, 7]

    order = find_order(10**5)
    print(order[-5:]) # [52545, 85313, 36161, 3393, 68929]