原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
#include <cstdio> long k, m, begin; int check(long remain) { long result = (__[1]__) % remain; if (__[2]__) { begin = result; return 1; } else return 0; } int main() { long i, find = 0; scanf("%ld", &k); for (m = k; __[3]__; m++) { find = 1; begin = 0; for (i = 0; i < k; i++) if (!check(__[4]__)) { find = 0; break; } } printf("%ld\n", __[5]__); return 0; }