CSES - Koko kierros

Aluksi listalla on kokonaisluvut [1,2,3,...,n][1,2,3,...,n] nousevassa järjestyksessä. Joka askeleella otat listan kaksi ensimmäistä alkiota ja siirrät ne listan loppuun käänteisessä järjestyksessä. Monenko askeleen jälkeen listan alkuperäinen järjestys on palautunut?

Esimerkiksi tapauksessa n=5n=5 listan sisältö on aluksi [1,2,3,4,5][1,2,3,4,5] ja muuttuu sitten seuraavasti:

  • [3,4,5,2,1][3,4,5,2,1]
  • [5,2,1,4,3][5,2,1,4,3]
  • [1,4,3,2,5][1,4,3,2,5]
  • [3,2,5,4,1][3,2,5,4,1]
  • [5,4,1,2,3][5,4,1,2,3]
  • [1,2,3,4,5][1,2,3,4,5]

Tässä tapauksessa siis 66 askeleen jälkeen listan järjestys on palautunut.

Voit olettaa, että nn on välillä 21092 \dots 10^9. Huomaa, että nn on suuri, joten ei ole mahdollista luoda niin suurta listaa ja simuloida prosessia, vaan sinun tulee keksiä tehokkaampi algoritmi.

Python

Toteuta tiedostoon fullround.py funktio count, joka antaa askelten määrän.

def count(n):
    # TODO

if __name__ == "__main__":
    print(count(2)) # 2
    print(count(5)) # 6
    print(count(31)) # 240
    print(count(1234567)) # 381038919372

Java

Toteuta tiedostoon FullRound.java metodi count, joka antaa askelten määrän.

public class FullRound {
    public long count(int n) {
        // TODO
    }

    public static void main(String[] args) {
        FullRound f = new FullRound();
        System.out.println(f.count(2)); // 2
        System.out.println(f.count(5)); // 6
        System.out.println(f.count(31)); // 240
        System.out.println(f.count(1234567)); // 381038919372
    }
}