数学小技巧 UVA 1394 约瑟夫环

约瑟夫环问题:详解

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值