小珂的游戏
-
描述
-
假设有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> int main() { int k,s,m,t; int a[30]={0}; while(scanf("%d",&k)&&k!=0) { if(a[k]==0) { m=0; while(true) { m++; t=0; s=2*k; while(true) { t=(t+m-1)%s+1; if(t>k) { s--; t--; } else break; } if(s==k) { a[k]=m; break; } } } printf("%d\n",a[k]); } return 0; } 法二:
-
#include<stdio.h> int c[16]={0}; int f(int k,int m) { int n,x=1; if(c[k]!=0) return 0; for(n==1;n<=k;n++) { x=(x+m-1)%(2*k-n+1); if(x==0) x=2*k-n+1; if(x<=k) return 1; } return 0; } int main() { int k,m,i,s; while(scanf("%d",&k)&&k!=0) { i=0; for(m=k+1;m<=k*2;m++) { s=2*k*i+m; if(m==k*2) { i++; m=k; } if(f(k,s)==0) { if(c[k]==0) c[k]=s; printf("%d\n",c[k]); break; } }
} }