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:

第一步和第二部中的字母没有协调好,凑合的看吧

原创粉丝点击