kmjp's blog

競技プログラミング参加記です

yukicoder : No.2121 帰属関係と充足可能性

ややこしい問題設定。
https://yukicoder.me/problems/no/2121

問題

有限集合V(n)を以下のように定める。

  • V(0)は空集合
  • V(n)はV(n-1)の冪集合

正整数Nと、2以下の非負整数A(0)~A(5)が与えられる。

 ( ( ( ( \forall x_3 \in V_N ( (x_3 \in m_{A_0} ) \to (x_3 \in m_{A_1} ) ) ) \land (m_{A_1} \in m_{A_2} ) ) \land (m_{A_3} \in m_{A_2} ) ) \land (m_{A_4} \in m_{A_3} ) ) \land (m_{A_5} \in m_{A_0})
を満たすV_nの要素m0、m1、m2が存在するか判定せよ。

解法

∧以降の条件より、
m(A(1)) != m(A(2))
m(A(3)) != m(A(2))
m(A(4)) != m(A(3))
m(A(5)) != m(A(0))
でなければならない。

また最初の条件より
m(A(5)) ∈ m(A(1)) ∈ m(A(2))
なので、Nが3以上かつ
m(A(5)) != m(A(1))
m(A(5)) != m(A(2))
m(A(1)) != m(A(2))
でなければならない。
これらを愚直に判定しよう。

int N;
int A[6];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,6) cin>>A[i];
	
	if(N>=3&&A[1]!=A[2]&&A[3]!=A[2]&&A[4]!=A[2]&&A[5]!=A[0]&&A[5]!=A[1]&&A[5]!=A[2]&&A[0]!=A[2]) {
		cout<<"YES"<<endl;
	}
	else {
		cout<<"NO"<<endl;
	}
}

まとめ

考察中心な問題。