我在这道题上花了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$

Codeforces #765D的更多相关文章

  1. 【codeforces 765D】Artsem and Saunders

    [题目链接]:http://codeforces.com/contest/765/problem/D [题意] 给你一个函数f(x); 要让你求2个函数g[x]和h[x],使得g[h[x]] = x对 ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. Java 堆内存和栈内存

    看了一些别人总结的博客,感觉对堆内存和栈内存有了一个初步的认识.所以来写写自己对堆内存和栈内存的理解. Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象 ...

  2. uvm_transaction——事物

    文件: src/base/uvm_transaction.svh 类:  uvm_transaction   uvm_transaction继承自uvm_object,添加了timing和record ...

  3. MySQL的information_schema的介绍(转)

    转自:http://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html, 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一 ...

  4. iOS开发资源:推送通知相关开源项目--PushSharp、APNS-PHP以及Pyapns等

    PushSharp  (github) PushSharp是一个实现了由服务器端向移动客户端推送消息的开源C#库,支持 iOS (iPhone/iPad APNS). Android (C2DM/GC ...

  5. python matplotlib 可视化操作实例

    具体代码: # encoding: utf-8 # coding = utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') from ...

  6. java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等

    ava 常用流处理工具 StreamTool ,常见的InputStream 流转字符串, 转字节数组等等 **应用场景: ** 1. 文件上传 2. js / css / img 等文件读取输出. ...

  7. js中的跨域方法总结

    什么是跨域? 浏览器的安全策略,只要协议,域名,端口有任何一个不同,就被当做不同的域. 下面对http://www.qichedaquan.com的同源检测 http://www.qichedaqua ...

  8. 【计算机网络】DNS的作用以及修改DNS的方法

    1.DNS的作用及修改DNS的方法 1.1.DNS的作用 DNS就是将域名映射成ip的分布式数据库服务器,它的作用如下图: 1.2.修改DNS的方法 常用的DNS服务器 1.114.114.114.1 ...

  9. python爬虫入门四:BeautifulSoup库(转)

    正则表达式可以从html代码中提取我们想要的数据信息,它比较繁琐复杂,编写的时候效率不高,但我们又最好是能够学会使用正则表达式. 我在网络上发现了一篇关于写得很好的教程,如果需要使用正则表达式的话,参 ...

  10. 【笔记】PIL 中的 Image 模块

    Image 模块提供了一个同名类(Image),也提供了一些工厂函数,包括从文件中载入图片和创建新图片.例如,以下的脚本先载入一幅图片,将它旋转 45 度角,并显示出来: 1 >>> ...