北航的一个ACM题目----约瑟夫,求快速的解法!!!

oyzdz1988 2009-08-13 09:22:02
约瑟夫
时间限制:1000 ms 内存限制:65536 KB

描述
我们都知道joseph问题,n个人围成一圈以m报数,报m的人被杀死,余下来的人接着从1报数,直到剩最后一人。

现在我们已知有k个好人,k个坏人,(1<=k<=14)围成一圈报数,前k个为好人,后k个为坏人,求最小的m使得所有的坏人先被杀死(保证不死一个好人的情况)



输入
多组测试数据,以0结束

输出
每组数据对应一个输出结果,每个结果一行

样例输入
3
4
0

样例输出
5
30


我老是超时,最后是一个个的求出来,建了个表AC的,前13个很快,但k=14时,花时间较多~
请问这个题目有直接解出的算法吗?
...全文
209 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wangzheqin 2010-01-07
参考Concrete mathematics第一章的习题。
回复
绿色夹克衫 2009-11-25
不好意思,我也把问题想简单了,虽然可以通过模方程来求解,但符合条件的模方程的数量也不少呢,
也是指数级的。

如果只是任意求1个解的话,可以通过GCD,求出k+1,k+2....2*k的最小公倍数,这就是一个合格的解。
但最小解似乎没有太多的规律。

不过这个最小解M mod (K + 1) 一定等于0或1,在枚举m的时候,可以从这个条件开始构造,提高一些效率。

M mod (k+1) + M mod (k+2) + ..... M mod 2k = 0;(当余数 > 除数的一半时,取负值)
回复
绿色夹克衫 2009-11-24
用模逆应该可以求,LZ看看中国剩余定理吧!
回复
bigc2000 2009-08-13
错了,我说错了,
不好意思,这个是ACM题,sorry,很难的,而且可能不存在这样的M,N
回复
bigc2000 2009-08-13
链表,O(n),时间足够
回复
oyzdz1988 2009-08-13
不是那个公式能解决的~

[Quote=引用 2 楼 joanlynnlove 的回复:]
Google。
两个关键字:约瑟夫环  公式
Ok。
[/Quote]
回复
acdbxzyw 2009-08-13
Google。
两个关键字:约瑟夫环 公式
Ok。
回复
jhkwei 2009-08-13
你去看看,具体数学,上面专门有讲
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告