约瑟夫环

refer:

点击打开


题目:N个人(编号0,...,N-1)围坐一圈,给定幸运数字M,从0开始依次报数,报到M-1的人出局,下一个人继续从0开始报数,循环,求最后一名成员。

(注:为了与习惯的编程表达一致,这里统一从0开始编码)


思路:

直接循环判断,时间代价太大。

数学推导:

①第一次,N个人参与,则第M%N-1个人出局,剩下N-1个人;(这里,我们标识结果为f(n))

②从上次出局的下一个人开始,即原始编码为M%N的人,他报号为0,则下一个淘汰的人应该是原始编码为:(M%N)+(M%(N-1)-1)的人;

得出,f(n) = (f(n-1) + M)%N


代码:

#include<iostream>
using namespace std;
int main()
{
	int N;
	int M;
	cin>>N;
	cin>>M;
	int result=0;	//f(1);
	for (int i=2; i<=N; i++)
	{
		result=(result+M)%i;
	}
	cout<<"lucky one is "<<result+1<<endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值