题目:http://acm.hit.edu.cn/hoj/problem/view?id=1017
题意:
前K个是好人,后K个是坏人,要求在杀掉第一个好人之前,已经杀掉所有坏人
分析:
模拟一下约瑟夫问题的过程,枚举m,看看是否前K次会杀掉好人,如果会,那么m就不行。
#include<cstdio>
int f[15];
bool solve(int k,int m)
{
int s=0,e=k-1;
for(int i=2*k;i>k;i--){
int kill=(m-1)%i;
if(kill>=s&&kill<=e){
return false;
}
s=((s-m)%i+i)%i;
e=((e-m)%i+i)%i;
}
return true;
}
void init()
{
for(int k=1;k<15;k++){
for(int m=k+1;;m++){
if(solve(k,m)){
f[k]=m;break;
}
}
}
}
int main()
{
int n;
init();
while(~scanf("%d",&n)&&n){
printf("%d\n",f[n]);
}
return 0;
}