填一个一年前的坑

nn只猴子选大王,编号顺时针从00n1n-1,从11号猴子开始顺时针从11报数,报到mm的猴子退到圈外,接着从11报数,最后剩下的猴子成为大王。

考虑递推,假设已经知道了n1n-1只猴子时编号为xx的猴子会成为大王。
而且我们知道nn只猴子时第一个出圈的是(m1)%n(m-1)\%n号猴子,那么可以把剩下的猴子重编号成为子问题。可以推出(x+m)%n(x+m)\%n会成为大王。
于是有一个O(n)O(n)递推的做法。

特别地,当m=2m=2,猴子编号从11nn时我们有更优秀的做法。首先,若n=2kn=2^k则易得11号猴子就是大王。设n=2k+t,t<2kn=2^k+t,t<2^k,则考虑先tt个猴子出圈之后下一只猴子就是大王。于是易得2t+12*t+1号猴子成为大王。
值得一提的是,设J(n)J(n)nn只猴子时的答案,则J(n)J(n)即为nn在二进制下循环左移一位,这个通过刚才推得的结论易得。