题目:约瑟夫环,有一个环先删掉第一个元素,然后每隔m个数字删掉,问最后剩下的是2号元素,
则应该去的最小m为多少。
分析:数论,模拟。将元素编号0~n-1,最后剩下编号的递推关系:f(n,m)=(f(n-1,m)+m)%n。
因此,问题转化成n-1元素,剩下第一个元素的约瑟夫环,按循序枚举m找到第一个成立的即可。
说明:╮(╯▽╰)╭。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int deal(int n, int m)
{
int s = 0;
for (int i = 2; i < n; ++ i)
s = (s+m)%i;
return s;
}
int main()
{
int n;
while(cin >> n && n) {
for (int i = 1; ; ++ i) {
if (!deal(n, i)) {
cout << i << endl;
break;
}
}
}
return 0;
}