C语言POJ的一个题目算法没看懂,求帮忙。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言POJ的一个题目算法没看懂,求帮忙。。。相关的知识,希望对你有一定的参考价值。

题目大意:1..n的一个排列An被称作完美排列,等价于数列|Ai - i|是0..n-1的一个排列。对于指定的n≤1000,给出一个完美排列或者输出0表示不存在1..n的完美排列。 这个MS是罗马尼亚数学竞赛的题…… 如果作为ACM问题的话最合适的做法是搜小数据然后找规律 >_< 不过这显然不是我们研究科学问题的态度……下面给出一个带证明的做法。 首先我们证明,当且仅当n ≡ 0, 1 (mod 4)的时候存在1..n的完美排列。 首先,由于|Ai - i|是0..n-1的一个排列,所以∑|Ai - i| = n(n-1)/2。 同时,∑|Ai - i| ≡ ∑(Ai - i) = ∑Ai - ∑i = 0 (mod 2)。 故n(n - 1)/2 ≡ 0 (mod 2)。这样就得到n ≡ 0, 1 (mod 4)。 下面我们构造满足题意的解: 我们把排列看做置换。 n ≡ 0 (mod 4) 的时候,一个可行的置换是轮换(1, n, 2, n - 1, 3, n - 2, ..., n/4, 3n/4 + 1, n/4 + 1, 3n/4 - 1, ..., n/2 - 1, n/2 + 1, n/2)。 3n/4 为这个置换的唯一不动点。 n ≡ 1 (mod 4) 的时候,设s = n - 1,一个可行的置换是轮换(1, n, 2, n - 1, 3, n - 2, ..., s/4, 3s/4 + 2, s/4 + 1, 3s/4, s/4 + 2, 3s/4 - 1, ..., s/2, s/2 + 1)。 而3s / 4 + 1为这个置换的唯一不动点。 这就证明完毕。于是这个题也就解决了。 代码就不贴了。 当且仅当n ≡ 0, 1 (mod 4)是什么意思啊 整个算法有谁还能简单地解释下呢 证明的第三行开始都不懂了

参考技术A ≡这个是恒等于的意思,n

0
(mod
4),所以这句话的意思是n除以4余0,mod是取模运算,n关于4取模,也就是求n除以4的余数,另一句同理。
下面分类讨论了两种情况,得出了不动点,即经过映射后,是自身的点。

以上是关于C语言POJ的一个题目算法没看懂,求帮忙。。。的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3243 Clever Y Extended-Baby-Step-Giant-Step

求高手,c语言题目,随机输入一个数,范围100到1000.判断它是不是是6和19的倍数。最好for语

请C语言版数据结构高手帮帮忙!

大家帮帮忙,用递归算法的分治策略求一个数组的众数,用c语言编写,告诉我算法都可以!先谢

急!!![80分]求一C语言程序

数据结构算法C语言实现--- 3.2栈的应用举例:迷宫求解与表达式求值