問題一覧 > 教育的問題

No.2540 同値性判定

レベル : / 実行時間制限 : 1ケース 2.500秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 6
作問者 : 👑 p-adic / テスター : CuriousFairy315
1 ProblemId : 9568 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2023-08-26 15:36:34

注意

この問題の実行時間制限は2500[ms]です。

問題文

まずは用語の説明です。ここでは命題変数と言ったら PP66 未満の非負整数の添字をつけた文字列、すなわち P0,P1,P2,P3,P4,P5P_0, P_1, P_2, P_3, P_4, P_5 のいずれかを表します。

良い命題とは、11 個以上の命題変数に論理演算 ,,\land, \lor, \Rightarrow00 回以上適用して得られる命題のことです。ただし構文の曖昧さをなくすため、論理演算の適用時には両側をカッコ (,)(,) でくくります。例えば (P0P0)(P_0 \land P_0) は良い命題ですが、¬P0\neg P_0 は良い命題ではありません。

以下、命題を知らない人向けに良い命題の定義について再帰を用いた説明を書きます。(クリックで開く)

 

命題変数とカッコ (,)(, ) と記号 ,,\land, \lor, \Rightarrow のみからなる文字列が良い命題であるということを以下のように再帰的に定めます:

  • 命題変数は良い命題である。
  • 任意の良い命題 aabb に対し、文字列 ((aa\landbb)) をこの順に結合して得られる文字列 (ab)(a \land b) は良い命題である。
  • 任意の良い命題 aabb に対し、文字列 ((aa\lorbb)) をこの順に結合して得られる文字列 (ab)(a \lor b) は良い命題である。
  • 任意の良い命題 aabb に対し、文字列 ((aa\Rightarrowbb)) をこの順に結合して得られる文字列 (ab)(a \Rightarrow b) は良い命題である。
以下、集合などの再帰的定義について詳しくない人向けの説明を書きます。(クリックで開く)

 

XX を集合とします。例えば XX は特定の文字のみからなる文字列の集合などです。今回説明するのは、XX の部分集合などを再帰的に定義する際の数学特有の言い回しです。

例えば XX の要素 cc と非負整数 n0,m0,n1,m1n_0,m_0,n_1,m_1 と写像 F0 ⁣:Xn0×Xm0XF_0 \colon X^{n_0} \times X^{m_0} \to XF1 ⁣:Xn1×Xm1XF_1 \colon X^{n_1} \times X^{m_1} \to X を用いて次のような書き方をすることがあります:

 

XX の部分集合 X0X_0 を以下のように再帰的に定める:

  • cX0c \in X_0 である。
  • 任意の (a,t)X0n0×Xm0(a,t) \in X_0^{n_0} \times X^{m_0} に対し、F0(a,t)X0F_0(a,t) \in X_0 である。
  • 任意の (a,t)X0n1×Xm1(a,t) \in X_0^{n_1} \times X^{m_1} に対し、F1(a,t)X0F_1(a,t) \in X_0 である。

 

これはあくまで例であって、今回は 33 つの条件としましたが一般には 33 つとは限りませんし、写像を用いるのではなく関係を用いることもあります。再帰的定義の一般の定式化[1] 6.1.1 Definitionはかなり抽象的なので、今回はこの問題を解く上で必要な例のみを考えることにします。

ここで重要なのは、この定義文は X0X_0 が単に 33 つの条件を全て満たす XX の任意の部分集合であるという意味を持つのではなく、次の定義文を表すということです:[1] 6.1.2 Definitionおよびその直後の段落参照

 

XX の部分集合 X0X_0 を、以下の 33 条件を全て満たす XX の部分集合 YY 全体の共通部分と定める:

  • cYc \in Y である。
  • 任意の (a,t)Yn0×Xm0(a,t) \in Y^{n_0} \times X^{m_0} に対し、F0(a,t)YF_0(a,t) \in Y である。
  • 任意の (a,t)Yn1×Xm1(a,t) \in Y^{n_1} \times X^{m_1} に対し、F1(a,t)YF_1(a,t) \in Y である。

 

Y=XY = X とすると確かに上の 33 条件を満たすので、条件を満たす YY 全体の集合は空でなく共通部分が定義されます。そして X0X_033 条件を満たす YY のうち最小のものである、ということが結果的に従います。

このように、部分集合の再帰的定義はただの条件の列挙ではなく最小性も含意するよう約束されていることに注意しましょう。ただしこれはあくまで再帰的定義に限った約束であり、通常の定義では最小性はもちろん含意されませんし、そもそも再帰的定義のような自己言及を通常の定義で行うと多くの場合循環論法となり定義が破綻します。

 

さて、XX 上の 11 項関係は XX の部分集合と等価であるため、XX 上の 11 項関係の再帰的定義においても同様の規則が適用されます。具体的には、

 

XX の要素が良い項であるということを以下のように再帰的に定める:

  • cc は良い項である。
  • 任意の (a,t)Xn0×Xm0(a,t) \in X^{n_0} \times X^{m_0} に対し、aa の任意の成分が良い項であるならば、F0(a,t)F_0(a,t) も良い項である。
  • 任意の (a,t)Xn1×Xm1(a,t) \in X^{n_1} \times X^{m_1} に対し、aa の任意の成分が良い項であるならば、F1(a,t)F_1(a,t) も良い項である。

 

のように「良い項である」という 11 項関係の再帰的定義を書いた場合、これは「良い項である」という述語が 33 条件を満たす任意の 11 項関係を表すという意味ではありません。上の定義文は次の定義文と等価なものになります:

 

XX の要素 xx が良い項であるということを、以下の 33 条件を全て満たす XX の任意の部分集合 YY に対し xYx \in Y が成り立つということと定める:

  • cYc \in Y である。
  • 任意の (a,t)Yn0×Xm0(a,t) \in Y^{n_0} \times X^{m_0} に対し、F0(a,t)YF_0(a,t) \in Y である。
  • 任意の (a,t)Yn1×Xm1(a,t) \in Y^{n_1} \times X^{m_1} に対し、F1(a,t)YF_1(a,t) \in Y である。

 

以上を踏まえると、今回の良い命題の再帰的定義は次の定義文と等価です:

 

命題変数とカッコ (,)(, ),,\land, \lor, \Rightarrow のみからなる文字列 ss が良い命題であるということを、命題変数とカッコ (,)(, ),,\land, \lor, \Rightarrow のみからなる文字列のみからなる任意の集合 YY に対し YY が以下の 33 条件を全て満たすならば sYs \in Y が成り立つということと定める:

  • 命題変数は YY の要素である。
  • YY の任意の要素 aabb に対し、文字列 ((aa\landbb)) をこの順に結合して得られる文字列 (ab)(a \land b)YY の要素である。
  • YY の任意の要素 aabb に対し、文字列 ((aa\lorbb)) をこの順に結合して得られる文字列 (ab)(a \lor b)YY の要素である。
  • YY の任意の要素 aabb に対し、文字列 ((aa\Rightarrowbb)) をこの順に結合して得られる文字列 (ab)(a \Rightarrow b)YY の要素である。

 

元の言い回しと比べてだいぶ複雑な言い回しとなりましたね。このような複雑な言い回しを避けるために、数学では今回紹介した簡潔な言い回しが定義され採用されているわけです。

例えば後で参考文献として挙げる

  • [1] における11 項関係「be an L\mathcal{L}-term」や「be an L\mathcal{L}-formula」の再帰的定義など
  • [2] における集合 TT および 11 項関係「be a principal term」の再帰的定義など
  • [3] における集合 B(α,β)B(\alpha,\beta)Kκ(γ)\textrm{K}_{\kappa}(\gamma) の再帰的定義など

で実際にそういった言い回しが採用されています。

 

参考文献

  1. W. Pohlers, "Proof Theory - The first step into impredicativity", Springer, 2010.
  2. W. Buchholz, "A New System of Proof-Theoretic Ordinal Functions", Annals of Pure and Applied Logic 32 (1986), pp. 195--207.
  3. M. Rathjen, "Ordinal Notations Based on a Weakly Mahlo Cardinal", Archive for Mathematical Logic 29 (1990), pp. 249--263.

 

 

入力の最初に 22 個の正整数 N,QN, Q が与えられます。

NN 未満の各非負整数 kk に対し良い命題 XkX_kPkmod6P_{k \bmod 6} として与えられています。ただし kmod6k \bmod 6kk66 で割った余りを表します。

以下で説明する QQ 個のクエリを与えられた順に処理してください。

 

各クエリは、

  • NN 未満の非負整数 hh
  • landlorRightarrowのいずれかの文字列 oo
  • 0r<N0 \leq \ell \leq r < N を満たす整数 ,r\ell,r
  • 0r<N0 \leq \ell' \leq r' < N を満たす整数 ,r\ell',r'

の組 (h,o,,r,,r)(h,o,\ell,r,\ell',r') です。クエリ (h,o,,r,,r)(h,o,\ell,r,\ell',r') は以下のように処理してください:

  1. まず良い命題 YY を、この時点での XhX_h の値と定める。
  2. 次に論理演算 OO を、oolandならば \landlorならば \lorRightarrowならば \Rightarrow と定める。
  3. そして kr\ell \leq k \leq r を満たす各非負整数 kk に対し、XkX_k の値を (XkOY)(X_k O Y) の値に置き換えることで更新する。
  4. 最後に更新後の値について「k0<k1r\ell' \leq k_0 < k_1 \leq r' を満たす非負整数 k0,k1k_0, k_1 であって Xk0X_{k_0}Xk1X_{k_1} が同値であるものが存在する」という命題の真偽を判定する。(以下、この真偽をこのクエリに対する回答と呼ぶ)

YY の値は各クエリ処理の最初に固定され、kr\ell \leq k \leq r を満たす各非負整数 kk に対する XkX_k の更新では変化しないことに注意してください。

2つの命題が同値であることの定義はこちらです。(クリックで開く)

 

まず論理に詳しくない人向けの大雑把な説明をします。命題 aabb に対し、「aabb が同値である」とは

  • aa が真であると仮定すると bb が真である。
  • bb が真であると仮定すると aa が真である。

の両方が成り立つということだと思ってください。

例えば P1P1P_1 \land P_1P1P1P_1 \lor P_1 は同値な命題です。実際 P1P1P_1 \land P_1 が真であると仮定すると P1P_1 が真となるので P1P1P_1 \lor P_1 も真となり、逆に P1P1P_1 \lor P_1 が真であると仮定するとやはり P1P_1 が真となるので P1P1P_1 \lor P_1 も真となります。一方で P1P_1P2P_2 は同値ではありません。実際 P1P_1 が真であるとしても P2P_2 は必ずしも真ではありません。

 

次に論理に詳しい(古典論理と直観主義論理の違いを知っている)人向けの厳密な説明をします。ここでは「aabb が同値である」ということを、

  • 古典論理において、aa を仮定すると bb が証明可能である。
  • 古典論理において、bb を仮定すると aa が証明可能である。

の両方が成り立つことと定義します。従って両向きの含意を証明するためには背理法、二重否定除去則、排中律はいずれも使って構いません。

入力

以下、QQ 以下の任意の正整数 qq に対し qq 個目のクエリを (hq,oq,q,rq,q,rq)(h_q,o_q,\ell_q,r_q,\ell'_q,r'_q) と置きます。

入力は以下の形式で標準入力から 1+Q1 + Q 行で与えられます:

  • 11 行目に N,QN, Q が半角空白区切りで与えられます。
  • QQ 以下の各正整数 qq に対し、1+q1 + q 行目に hq,oq,q,rq,q,rqh_q,o_q,\ell_q,r_q,\ell'_q,r'_q が半角空白区切りで与えられます。
NN QQ
h1h_1 o1o_1 1\ell_1 r1r_1 1\ell'_1 r1r'_1
\vdots
hQh_Q oQo_Q Q\ell_Q rQr_Q Q\ell'_Q rQr'_Q

制約

この問題はeasy版の制約とhard版の制約が設定されています。easy版の制約を満たすケースで全て AC が取れていればその提出自体が AC として扱われます。つまりeasy版の制約を満たさずhard版の制約を満たすケースはジャッジされますが提出自体のステータスには影響しません。easy版の制約で物足りない人やコンテスト中に時間を持て余した人はぜひhard版の制約に挑戦してみてください。

 

easy版の入力は以下の制約を満たします:

  • NN1N1061 \leq N \leq 10^6 を満たす整数である。
  • QQ1Q1041 \leq Q \leq \textcolor{blue}{10^4} を満たす整数である。
  • QQ 以下の任意の正整数 qq に対し、
    • hqh_q0h<N0 \leq h < N を満たす整数である。
    • oqo_qlandlorRightarrowのいずれかの文字列である。
    • q,rq\ell_q, r_q0qrq<N0 \leq \ell_q \leq r_q < N を満たす整数である。
    • q,rq\ell'_q, r'_q0qrq<N0 \leq \ell'_q \leq r'_q < N を満たす整数である。
  • QQ 以下の各正整数 qq を渡る rqqr'_q - \ell'_q の総和は 107\textcolor{blue}{10^7} 以下である。
hard版の制約はこちらです。(クリックで開く)

 

入力は以下の制約を満たします:

  • NN1N1061 \leq N \leq 10^6 を満たす整数である。
  • QQ1Q1051 \leq Q \leq \textcolor{red}{10^5} を満たす整数である。
  • QQ 以下の任意の正整数 qq に対し、
    • hqh_q0h<N0 \leq h < N を満たす整数である。
    • oqo_qlandlorRightarrowのいずれかの文字列である。
    • q,rq\ell_q, r_q0qrq<N0 \leq \ell_q \leq r_q < N を満たす整数である。
    • q,rq\ell'_q, r'_q0qrq<N0 \leq \ell'_q \leq r'_q < N を満たす整数である。
  • QQ 以下の各正整数 qq を渡る rqqr'_q - \ell'_q の総和は 108\textcolor{red}{10^8} 以下である。

なおhard版に挑戦する際は高速な言語の使用を推奨します。writer解の実行時間はc++では190[ms]とcLayでは167[ms]ですが、Python3とPyPy3ではいずれも10000[ms]以内に実行が終わらず TLE となります。

出力

QQ 以下の各正整数 qq に対し、qq 個目のクエリに対する回答が真ならばYesを、偽ならばNoqq 行目に 出力してください。

最後に改行してください。

サンプル

サンプル1
入力
1 1
0 land 0 0 0 0
出力
No

最初は X0=P0X_0 = P_0 として与えられています。

クエリ (h1,o1,1,r1,1,r1)(h_1,o_1,\ell_1,r_1,\ell'_1,r'_1) の各成分が半角空白区切りで0 land 0 0 0 0と与えられます。YY がこの時点での X0X_0 すなわち P0P_0 と定義され X0X_0 の値が

(X0Y)=(P0P0) (X_0 \land Y) = (P_0 \land P_0)

に置き換わります。更新後の X0=(P0P0)X_0 = (P_0 \land P_0) についてクエリに回答します。

ここで、0=1k0<k1r1=00 = \ell'_1 \leq k_0 < k_1 \leq r'_1 = 0 を満たす整数の組 (k0,k1)(k_0, k_1) がそもそも存在しません。従ってクエリへの回答は偽であり、Noと出力します。

サンプル2
入力
7 1
3 lor 1 5 0 6
出力
Yes

最初は (X0,X1,X2,X3,X4,X5,X6)=(P0,P1,P2,P3,P4,P5,P0)(X_0,X_1,X_2,X_3,X_4,X_5,X_6) = (P_0,P_1,P_2,P_3,P_4,P_5,P_0) として与えられています。X6X_6P0P_0 であることに注意しましょう。

クエリ (h1,o1,1,r1,1,r1)(h_1,o_1,\ell_1,r_1,\ell'_1,r'_1) の各成分が半角空白区切りで3 lor 1 5 0 6と与えられます。YY がこの時点での X3X_3 すなわち P3P_3 と定義され (X0,X1,X2,X3,X4,X5,X6)(X_0,X_1,X_2,X_3,X_4,X_5,X_6) の値が

(X0,(X1Y),(X2Y),(X3Y),(X4Y),(X5Y),X6)=(P0,(P1P3),(P2P3),(P3P3),(P4P3),(P5P3),P0) (X_0,(X_1 \lor Y),(X_2 \lor Y),(X_3 \lor Y),(X_4 \lor Y),(X_5 \lor Y),X_6) = (P_0,(P_1 \lor P_3),(P_2 \lor P_3),(P_3 \lor P_3),(P_4 \lor P_3),(P_5 \lor P_3),P_0)

に置き換わります。更新後の (X0,X1,X2,X3,X4,X5,X6)=(P0,(P1P3),(P2P3),(P3P3),(P4P3),(P5P3),P0)(X_0,X_1,X_2,X_3,X_4,X_5,X_6) = (P_0,(P_1 \lor P_3),(P_2 \lor P_3),(P_3 \lor P_3),(P_4 \lor P_3),(P_5 \lor P_3),P_0) についてクエリに回答します。

今回は 0=1k0<k1r1=60 = \ell'_1 \leq k_0 < k_1 \leq r'_1 = 6 を満たす整数の組 (k0,k1)(k_0, k_1) として (0,6)(0,6) が選べます。Xk0=X0=P0X_{k_0} = X_0 = P_0 かつ Xk1=X6=P0X_{k_1} = X_6 = P_0 であるので命題として X0X_0X6X_6 は一致し、特に X0X_0X6X_6 は同値です。従ってクエリへの回答は真であり、Yesと出力します。

サンプル3
入力
2 2
1 Rightarrow 0 1 0 1
1 Rightarrow 0 0 0 1
出力
No
Yes

最初は (X0,X1)=(P0,P1)(X_0,X_1) = (P_0,P_1) として与えられています。

まずクエリ (h1,o1,1,r1,1,r1)(h_1,o_1,\ell_1,r_1,\ell'_1,r'_1) の各成分が半角空白区切りで1 Rightarrow 0 1 1 1と与えられます。YY がこの時点での X1X_1 すなわち P1P_1 と定義され (X0,X1)(X_0,X_1) の値が

((X0Y),(X1Y))=((P0P1),(P1P1)) ((X_0 \Rightarrow Y), (X_1 \Rightarrow Y)) = ((P_0 \Rightarrow P_1), (P_1 \Rightarrow P_1))

に置き換わります。更新後の (X0,X1)=((P0P1),(P1P1))(X_0,X_1) = ((P_0 \Rightarrow P_1), (P_1 \Rightarrow P_1)) についてクエリに回答します。

0=1k0<k1r1=10 = \ell'_1 \leq k_0 < k_1 \leq r'_1 = 1 を満たす整数の組 (k0,k1)(k_0, k_1)(0,1)(0,1) に限られ、この (k0,k1)(k_0,k_1) に対しては (Xk1Xk0)(X_{k_1} \Rightarrow X_{k_0}) が必ずしも成り立たないので X0X_0X1X_1 は同値ではありません。従ってこのクエリへの回答は偽であり、Noと出力します。

 

次にクエリ (h2,o2,2,r2,2,r2)(h_2,o_2,\ell_2,r_2,\ell'_2,r'_2) の各成分が半角空白区切りで1 Rightarrow 0 0 0 1と与えられます。YY がこの時点での X1X_1 すなわち (P1P1)(P_1 \Rightarrow P_1) と定義され (X0,X1)(X_0,X_1) の値が

((X0Y),X1)=(((P0P1)(P1P1)),(P1P1)) ((X_0 \Rightarrow Y),X_1) = (((P_0 \Rightarrow P_1) \Rightarrow (P_1 \Rightarrow P_1)), (P_1 \Rightarrow P_1))

に置き換わります。更新後の (X0,X1)=(((P0P1)(P1P1)),(P1P1))(X_0,X_1) = (((P_0 \Rightarrow P_1) \Rightarrow (P_1 \Rightarrow P_1)), (P_1 \Rightarrow P_1)) についてクエリに回答します。

今回は 0=1k0<k1r1=10 = \ell'_1 \leq k_0 < k_1 \leq r'_1 = 1 を満たす整数の組 (k0,k1)(k_0, k_1) として (0,1)(0,1) が選べます。

まず Xk1=X1=(P1P1)X_{k_1} = X_1 = (P_1 \Rightarrow P_1) は常に成り立つため、(ZXk1)(Z \Rightarrow X_{k_1}) は良い命題 ZZ によらず成り立ち、特に (Xk0Xk1)(X_{k_0} \Rightarrow X_{k_1}) も成り立ちます。

次に Xk0=X0=(P0(P1P1))X_{k_0} = X_0 = (P_0 \Rightarrow (P_1 \Rightarrow P_1))(P0Xk1)(P_0 \Rightarrow X_{k_1}) に他ならないため、Xk1X_{k_1} が成り立つならば Xk0X_{k_0} も成り立ちます。すなわち (Xk1Xk0)(X_{k_1} \Rightarrow X_{k_0}) が成り立ちます。

以上より (Xk0Xk1)(X_{k_0} \Rightarrow X_{k_1})(Xk1Xk0)(X_{k_1} \Rightarrow X_{k_0}) の両方が成り立つことが分かったので、Xk0X_{k_0}Xk1X_{k_1} は同値です。従ってこのクエリへの回答は真であり、Yesと出力します。

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。