题目:有2n个人,前n个是好人后n个是坏人,求一个计算约瑟夫环的步长m,使得前n次选中的都是坏人。
分析:数学题。因为数据量很小,利用约瑟夫问题模拟即可。
说明:要先打表,否则会TLE。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int ans[15];
int can( int k, int m )
{
int now = 0;
for ( int i = 0 ; i < k ; ++ i ) {
now = (now+m-1)%(k*2-i);
if ( now < k )
return 0;
}
return 1;
}
int main()
{
for ( int i = 1 ; i < 15 ; ++ i ) {
for ( int j = i ; ; ++ j )
if ( can( i, j ) ) {
ans[i] = j;
break;
}
}
int n;
while ( cin >> n && n )
cout << ans[n] << endl;
return 0;
}