/*约瑟夫环问题
起始 : 0 1 2 3 ...... n-1 (头尾连接的环)
从这n个数字中 删除第m个 。
解析:
第一次删除第m个:
0 1 2 ...m-2 m ....n-1 (一共n个元素)
那么由于环的性质,重新排列头尾
====> m m+1 m+2 ... n-1 0 1 2 ...x' m-2 (n-1个元素)
对应序号 => 0 1 2 n-1-m n-m ..x n-1
应用动态归纳法:
x为n-1个元素中的胜利者的序号,那么x'为n个元素中的胜利者
当x <= n-m-1 时 , x'=x+m ;
当x >n-m-1时, x'=x+m-n;
综合以上2个 就是 x'=(x+m)%n
由此可知 :
f(n)= (f(n-1)+m )%n
又 f(1)=0;
可以得到以下代码:
*/
#include<stdio.h>
void main()
{
int a ,b,i,s=0;
scanf("%d %d",&a,&b);
for(i=2;i<=a;i++) // i为元素的个数
{
s=(s+b)%i;
}
printf("%d",s+1);
}
约瑟夫环问题
最新推荐文章于 2022-03-22 00:10:52 发布