joseph问题-北航的一个ACM题目
来源:互联网 发布:2016淘宝店还能赚钱吗 编辑:程序博客网 时间:2024/04/29 17:02
问题:
我们都知道joseph问题,n个人围成一圈以m报数,报m的人被杀死,余下来的人接着从1报数,直到剩最后一人。
现在我们已知有k个好人,k个坏人,(1 <=k <=14)围成一圈报数,前k个为好人,后k个为坏人,求最小的m使得所有的坏人先被杀死(保证不死一个好人的情况)
来源: 北航的一个ACM题目----约瑟夫,求快速的解法!!! (oyzdz1988)
解答:
解决方案为中国剩余定理。
1. 中国剩余定理
a) 简介:
中国剩余定理是指若有一些两两复质的整数m[1],m[2],…m[n],则对任意的整数:a[1],a[2],…,a[n],以下联立同余方程组对模 m[1],m[2],…,m[n]有公解:
X=a[i] mod m[i] (i=1,…,n)
那么X有小于 m[1]*m[2]*…*m[n] 的唯一解。
b) X的计算方法
假设M= m[1]*m[2]*…*m[n] , 那么 k[i]=M/m[i] ,计算l[i],使得 k[i]*l[i]=1 mod m[i]
X=( a[1]*k[1]*l[1]+ …+ a[n]*k[n]*l[n] ) mod M
2. 中国剩余定理在该题的应用
显然m满足如下要求
m=a[1] mod 2k
m=a[2] mod (2k-1)
…
m=a[k] mod (k+1)
由于2k , 2k-1 ,…, k+1 两两复素,可以使用中国剩余定理(显然,不予证明)
注意到中国剩余定理的计算公式
X= ( a[1]*k[1]*l[1] +…+ a[n]*k[n]*l[n] ) mod M
其中当好人个数k给定时,k[i]*l[i] (i=1,…,n)都固定,要得到m的大小只和a[i]相关。要计算最小的m,只需要的到最小的一组a[i],但是由于条件中限制不能杀死一个好人,因此a[i]有一定的取值防范,这就是该题难点。
根据该题的题意有a[i]>0,所以a[i]最小为1,这就是该题的突破点,若能够让a[i]=1或取值范围中的最小值,就能够保证m最小。
结论:
1) a[1]=k+1,第一步最小取值
2) a[i]=1 (i=2,…,k), 最小值
既,杀死坏人的顺序为k+1,k+2,k+3,…,2k。
步骤如下:杀死编号为k+1的坏人,那么编号为k+2的坏人此时从1开始报数,若m mod (2k-1) =1 ,该坏人被杀死,以此类推。
Ps:
第一步和第二部中的字母没有协调好,凑合的看吧
- joseph问题-北航的一个ACM题目
- PKU ACM 1012 JOSEPH问题
- [ACM Steps] Joseph 约瑟夫环问题
- acm上的一个小题目
- joseph的大m问题
- 【Joseph问题】poj1012 Joseph
- 关于题目“DATAbase, ACM/ICPC NEERC 2009, UVa1592”的一个小问题探讨
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- joseph问题
- joseph问题
- Joseph问题
- {joseph问题}
- Joseph问题
- Joseph问题
- ACM篇:POJ1012--Joseph
- 北航计算机2009年的复试上机题目
- 北航计算机2009年的复试上机题目
- Joseph问题的递推公式解法
- 求关于 试题解答
- ckeditor中文文档——开发者文档(2)整合
- Writing a custom module in Magento
- INDIRECT函数
- AjaxControlToolkit全球化+本地化的设置
- joseph问题-北航的一个ACM题目
- User Management的制作
- cpp primer 习题 10.28
- WEBLOGIC 配置
- JTabel今天搞的我太郁闷了
- CMD中文乱码问题之解决
- VB.NET中DataGrid自定义表格列名
- ckeditor中文文档——开发者文档(3)配置--配置设置
- 形象描述JBPM的简单部署