Codeforces #397 D: Artsem and Saunders
まず2式
g(h(x)) = x
h(g(x)) = f(x)
を別々に考えてみる。
g(h(x)) = x
を満たすg,hは
例えば
g(x)=x
h(x)=x
があり、必ず構成できる。
また
h(g(x)) = f(x)
については
g(x) = x, h(x) = f(x)
とすればよく、これもf(x)の値によらない。
ところが、2式を同時に条件とすると成り立たない場合がある。(入力例2)
なので2式を使って解が存在する条件を求める。(関数fだけで表す)
f(f(x)) = f(x)
これで解があるか調べられる。
解の構成を考える。
g(f(x))
= g(h(g(x))
= 1(g(x))
= g(x)
g(f(x)) = g(x)
h(g(x)) = f(x)
の2式より解を作っていく。
g(f(x)) = g(x)
より
y = f(x)
とすると
g(y) = g(x)
これによりmを決める。(素集合を考えればいい)
z=g(x) として1<=z<=m
g(f(x)) = z
h(z) = f(x)
なのでf(x)の値ごとにzを追加していけばいい。