例如:n = 3
一开始,序列为1 2 3 | 4 5 6
然后序列为 4 1 5 | 2 6 3
接着为 2 4 6 | 1 3 5
最后为 1 2 3 | 4 5 6
所以m = 3.
找出规律就可以解决了,只需要第一个数,也就是1的位置重新回到位置1,那整个数列就变回开始的序列了。
1的位置 i 小于等于n时,下一个位置是 2 * i ;i 大于 n 时,下一个位置是 2 * (i - n)- 1.
下面是AC的代码:
#include <iostream> using namespace std; int main() { int n, sum; while(cin >> n) { sum = 0; int i = 1; i *= 2; sum++; while(i != 1) { if(i <= n) i *= 2; else i = 2 * (i - n) - 1; sum++; } cout << sum << endl; } return 0; }
原文:http://blog.csdn.net/qq_25425023/article/details/45771357