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]\)
满足下列两个性质

  1. \(\forall x \in [m], g(h(x)) = x\)
  2. \(\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\) 本身。

所以应当进一步挖掘有解的必要条件甚至充要条件。

题解上的分析

\[\left. \begin{aligned} g \circ h = \mathbf{1} \\\\ h \circ g = f \end{aligned} \right\\} \Longrightarrow \begin{aligned} f \circ f &= (h \circ g) \circ (h \circ g) \\\\ &= h \circ (g \circ h) \circ g \\\\ &= h \circ \mathbf{1} \circ g \\\\ &= h \circ g \\\\ &= f \end{aligned} \]

\(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\)

posted @ 2017-02-16 21:36  Pat  阅读(248)  评论(0编辑  收藏  举报