首先简单介绍一下约瑟夫环:
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;
依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题
的解。
数学推导
我们分别将他们的编号编为0,1.,2......N-1
每次即数到M-1号的人出局
例如说:
M=3;N=15
第一次出局的人即为(M-1)%N为2号
第二次出局时,将3号置为0此时只剩下N-1人
此次出局的就是(M-1)%(N-1)即为5号
接下俩就是(M-1)%(N-2)即为8号
可以观察到 5=2+M;
8=5+M;
.....反复循环后
我们可以用反向思维来思考:
发现当仅仅剩下一人时那个人一定在0号位 即f(1)=0;
当还剩下两个人的时候 那个人一定在f(1)+M号位;
以此类推:
即
f(i)=(f(i-1)+M);
为了防止超出人数限制 :
f(i)=(f(i-1)+M)%i;
因此我们的递推公式就出炉了
于是我们可以轻松解决约瑟夫环的问题
#include<iostream>
using namespace std;
int main()
{
int N,M;
cin>>N>>M;
int ans=0;
for(int i=2;i<=N;i++)
{
ans=(ans+M)%i;
}
cout<<ans+1<<endl;
return 0;
}
**超级简洁的代码**