标签:
Description
Input
Output
Sample Input
3 4 0
Sample Output
5 30
题意:约翰夫环的变形。
先说约翰夫环,即n个人围成一圈报数,报到数的人离开,问最后离开的那人的编号
s = 1; for(int i = 1; i <= n; i++){ s = (s + m - 1)%i; }
输出的s就是最后的编号(根据n改变改变),即从零个数开始逆推上去原来的编号,不是推出的人,是编号的转变。
本题是前n个好人后n个坏人,要算出的是坏人的编号,即推出的人的编号,所以是%len开始
#include<cstdio> #include<cstring> using namespace std; bool check(int n,int m) { int len = 2*n; int s = 1; for(int i = 1; i <= n ; i++){ s = (s + m - 1)%len; if(s == 0) s = len; len--; if(s <= n) return false; if(s > len) s = 1; } return true; } int main(){ int a[100]; int n,m; for( n = 1; n < 14;n++){ for( m = n+1;;m++){ if(check(n,m)){ a[n] = m; break; } } } while(~scanf("%d",&n)&&n){ printf("%d\n",a[n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4314171.html