约瑟夫问题特殊场景下的特殊解法

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫问题特殊场景下的特殊解法相关的知识,希望对你有一定的参考价值。

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

约瑟夫问题特殊场景下的特殊解法

首先明确特殊场景是什么?
是指步长为2的约瑟夫问题

Code

#include<stdio.h>
int main(void)
{
	int bit_num=0;
	unsigned long long n=0;
	unsigned long long _n;
	scanf("%llu",&n);//n总人数
	_n = n;

	while(_n>>=1)	++bit_num;
	_n = n^(1<<bit_num);
	_n = (_n<<1)|1;
		
	printf("_n %d\\n",_n);
	return 0;
}

原理解释

在step=2的约瑟夫问题下,我们发现问题的解与样本容量的二进制表示有关,例如:
n=100,step=2下,最终的答案是73

首先我们看一下100的二进制形式(1100100)2 ,我们将(1100100)2循环左移一位得到(1001001)2= 73就是最终的解

这个原理的证明可以通过数学归纳法证明

性能比较

使用你的code运行 n = 121542168489541231651 , step=2
看一下多久可以得到结果,注意变量应该设置为 unsigned long long 类型

正确结果59754567

本人使用网上的code运行上面的测试用例,等到海枯石烂都没有结果,所有没有给出比较数据,只知道使用本人的code可以瞬间得出结果


以上是关于约瑟夫问题特殊场景下的特殊解法的主要内容,如果未能解决你的问题,请参考以下文章

laravel特殊功能代码片段集合

定位导航方案在特殊环境下的适用说明

注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题

某些情况下的 SQL 特殊排序顺序

小朋友学数据结构:约瑟夫环的链表解法数组解法和数学公式解法

jquery中的$的特殊用法