描述
假设有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<string.h>
int k,m;
int a[220];
int find(int k,int m)
{
int n,a=1;
for(n=1;n<=k;n++)
{
a=(a+m-1)%(2*k-n+1);
if(!a)
a=2*k-n+1;
if(a<=k&&a>=1)
return 0;
}
return 1;
}
int main()
{
int n;
while(scanf("%d",&k)!=EOF,k)
{
int r,h,w=0;
if(!a[k])
{
for(r=0;;r++)
{
for(h=k+1;h<=2*k;h++)
{
m=2*k*r+h;
if(find(k,m))
{
w=1;
break;
}
}
if(w==1)
break;
}
}
else
w=1;
if(w)
{
if(!a[k])
a[k]=m;
printf("%d\n",a[k]);
}
}
}