数学小技巧 UVA 1394 约瑟夫环

来源:互联网 发布:史丹利快报淘宝店铺 编辑:程序博客网 时间:2024/05/23 10:34

约瑟夫环问题:详解

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1]  结果+1即为原问题的解。

#include "cstdio"#include "iostream"#include "cstring"#include "algorithm"using namespace std;/*约瑟夫环从结果向上推 题意:一共n个数绕成环1-n,一开始在m位置上,每次循环走k步,走到的退出 题解:f(x)=(f(x-1)+k)%n;  */int main(){int n,k,m; while(~scanf("%d%d%d",&n,&k,&m) &&n+k+m){int ans=0;//倒着往上推//到最后的时候  只剩下一个,那个是答案//倒数第二个的时候  一直推到 最开始n个的时候// 以8 5 3 为例// i     ans                     // 2    (0+5)%2 =1 ;   // 3    (1+5)%3 =0 ;  // 4    (0+5)%4 =1 ;  // 5    (1+5)%5 =1 ;  // 6    (1+5)%6 =0 ;   // 7    (0+5)%7 =5 ;   //ans=  (5+3)%8+1=1;     for(int i=2;i<=n-1;i++){ans=(ans+k)%i;}ans=(ans+m)%n +1;//一开始从m开始,题目是1-n 所以要+1 printf("%d\n",ans);}return 0;}


0 0