描述
假设有2k个人围着一个圆桌坐着,前k个是好人,后k个是坏人 。现在开始,每m个人踢掉一个,比如有6个人,m=5,那么,被踢掉的人依次是5,4,6,2,3,1。现在要求,在踢掉第一个好人前,必需把所有的坏人踢掉,问,给定一个k,求满足这个要求的最小的m,现在希望你写一个程序,快速的帮助小珂,计算出来这个m。
输入
每行一个整数k(k<15),0表示输入结束.总测试数据的组数不多于200.
输出
各个组对应的最小的m,换行结束。
样例输入
3
4
0
样例输出
5
30
#include <stdio.h>
#include <stdlib.h>
int save[15]={0};
int func(int k)
{
int m,n,x,y,flag,num;
if(k == 1){
save[0] = 2;
return 2;
}else if(k > 14){
return -1;
}
for(m=k+1; m<100000000; m++){
if((m%(2*k))<k && (m%(2*k) != 0)){
continue;
}
n=0;
flag=0;
num=0;
while(1){
x = (m - num) % (2*k-flag);
//printf("x=%d,m=%d,num=%d,flag=%d\n", x,m,num,flag);
if(x > k || x == 0){
n++;
}else{
break;
}
num = 2*k -flag - x;
num %= (2*k-flag);
flag++;
}
if(k <= n){
break;
}
}
save[k-1] = m;
return m;
}
int main(int argc, char **argv)
{
int i,k;
for(i=1; i<15; i++){
func(i);
}
while(scanf("%d", &k)){
if(0 == k){
break;
}
printf("%d\n",save[k-1]);
}
return 0;
}