约瑟夫问题。
本题一开始就把第一个人拿了出去,所以本题其实是(n-1)个人的约瑟夫问题。
枚举m,因为m的答案不会太大,所以可以直接枚举,然后进行O(n)的判断。总复杂度O(mn)完全可以。
#include <iostream>
#include <cstdio>
using namespace std;
int n;
bool check(int m)
{
int win = 0;
for(int i = 2; i < n; i++) win = (win + m) % i;
if(win == 0) return true;
return false;
}
int main()
{
while(1 == scanf("%d", &n) && n > 0) {
for(int i = 1; ; i++) {
if(check(i)) {
printf("%d\n", i);
break;
}
}
}
return 0;
}