题意:约瑟夫环问题,给定人数n,求一个步长m使得最后剩下的是2.
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int num[200];
int Josephus ( int n, int m, int s )
{
if ( m == 1 )
return ( s + n - 1 ) % n;
for ( int i = 1; i <= n; i++ )
{
s = ( s + m ) % i;
if ( i == n ) break;
if ( s + m < i )
{
int x = (i-s) / (m-1); // s + m * x <= i + x;
if ( i + x < n )
{
i = i + x;
s = ( s + m * x ) % i;
}
else { s = (s + m * (n-i)) % n; break; }
}
}
return s;
}
int main()
{
int n, i;
memset(num,0,sizeof(num));
while ( scanf("%d",&n) && n )
{
if ( num[n] )
{
printf("%d\n",num[n]); continue;
}
for ( i = 1; ; i++ )
{
if ( Josephus ( n - 1, i, 0 ) == 0 )
{
num[n] = i;
printf("%d\n",i);
break;
}
}
}
return 0;
}