约瑟夫环问题

约瑟夫环运作如下:

①n个人围在一起坐成环状

②从编号1开始报数

③数到某个数m的时候,此人出列,下一个人重新报数

④一直循环,直到留下最后一个人k,约瑟夫环结束

例如:8个人围成一圈,从序号为1的人开始报数,报到3的出列,,下个人重新报数,求最后剩下的人编号

最初状态:

  1  2 #3  4  5  6 *7  8

           ↓

  6  7       1  2 #3 *4  5     -----     问题被简化为7个人围成一圈,但同样报到3的人出列

                        ↓
#3  4       5  6      *1  2     -----     问题继续被简化为6个人围成一圈(原题可缩小规模)

……                                                     ↓

显然当n = n-1时,通过公式k = (k+m)%n把k变回刚好就是n个人情况的解

(但这时k可能为0,所以要假设这些人序号从0开始,最后答案加1)
                                                             ↓

                             一直递推,直到n = 2(k通过公式逆向推回)


#include<stdio.h>
int main(void)
{
	int n, m, i, k;
	scanf("%d%d", &n, &m);
	k = 0;
	for(i=2;i<=n;i++)
		k = (k+m)%i;
	k += 1;
	printf("%d\n", k);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值