约瑟夫问题
约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)
一般形式
N
个人围成一圈,从第一个开始报数,第
例如
N
=
获胜者便是
5
。
最初的方法
用数组模拟链表,模拟整个淘汰过程。
Solution1.0
int work(int n,int m)
{
int now=1,last=n;
fo(i,1,n)next[i]=i+1;
next[n]=1;
fo(i,1,n-1){
fo(l,1,m-1)last=now,now=next[now];
next[last]=next[now]; now=next[now];
}
return now;
}
O(n)的方法
将编号换成
考虑将第一个人淘汰后(可以推出此人的编号为
转移方程式(仔细想一下就可以推出来了
Solution2.0
f[1]=0;
f[i]=(f[i-1]+m)%i;//(i>1)
终极方法
如果n特别大怎么办,这时就需要一个与m相关的复杂度的方法。
设
g
(
当