Codeforces #765D
我在这道题上花了2个小时,仍没解出。理一下当时的思路,看看症结到底在哪里。
题意
用 \([n]\) 表示集合 \(\\{1,2,3,\dots, n\\}\) 。
3个函数
\(f \colon [n] \to [n]\)
\(g \colon [n] \to [m]\)
\(h \colon [m] \to [n]\)
满足下列两个性质
- \(\forall x \in [m], g(h(x)) = x\)
- \(\forall x \in [n], h(g(x)) = f(x)\)
给出 \(f\) ,求 \(g, h\) 。如有多解,任给一组。
分析
由性质1可知
- \(g\) 是满射(surjective),\(h\) 是单射(injective)
进而据性质2可知
- \(g\) 和 \(h\) 值域相同 \(\Rightarrow\) \(m\) 等于 \(f\) 的不同函数值的个数。换言之,\(h\) 是 \(f\) 值域中元素的一个排列。
- \(\forall x_1, x_2 \in [n], g(x_1) = g(x_2) \Leftrightarrow f(x_1) = f(x_2)\) 。换言之,\(h\) 和 \(f\) 相似。
至此可得有解的一个必要条件:
对于 \(f\) 值域中的任意两不同元素 \(y_1, y_2\),\(f(y_1) \ne f(y_2)\) 。
遗憾的是,这个必要条件太弱了。
样例
2
2 1
满足条件,却是无解的。
思路到这里就断了。
现在回过头来想,问题的根源在于:
在 \(f\) 满足上面推导出的必要条件的情况下,将 \(h\) 任取为 \(f\) 值域中元素的一个排列后,再求 \(g\) 时,性质1和性质2仍可能互相矛盾。
那么是否需要枚举排列呢?
我没有认识到的是
不论如何求解 \(g\) 和 \(h\),是否有解只取决于 \(f\) 本身。
所以应当进一步挖掘有解的必要条件甚至充要条件。
题解上的分析
若 \(f(x) = y\),则 \(f(y)=f(f(x))=f(x)=y\) 。
即 \(f\) 值域中的每个元素都是 \(f\) 的不动点(fixed point)。(性质3)
这个必要条件比上面那个必要条件强得多。
下面证明
若 \(f\) 满足性质3,则将 \(h\) 取为 \(f\) 值域中元素的任意排列,依据性质2求出的 \(g\) 都满足性质1。
\(g(x) = h^{-1}(f(x))\)
\(g(h(x)) = h^{-1}(f(h(x))) = h^{-1}(h(x)) = x\)