DOJ logoDOJ
Problems
Recently added problemsSaved problems
CategoriesDLCContestsGroupsTeamsBoard
Ranking
Solved Problem RankingStreak rankingDOJ Power ranking
Status
Call for TasksLoginRegister
DOJ logoDOJ

Community online judge with OI-style subtask scoring, Elo ratings, and Discord-backed certification.

Problems
ProblemsCategories
Community
ContestsRankingBoardNoticesHost an external contestGuide
Account
LoginRegisterJudge Status
Policy
Terms of ServiceDLC RulesPrivacyAPI documentationLanguage runtimesContest rank rewardsRating and performance
© 2026 DOJ
All rights reserved
Editorial

AND OR XOR

Back to problem

Editorial

Claim. 음이 아닌 정수 aaa, bbb, ccc에 대해, 다음 두 조건은 동치이다.

(a & b)=(b ∣ c)=(c⊕a)  ⟺  (a=b)∧(c=0).(a \,\&\, b) = (b \,|\, c) = (c \oplus a) \iff (a = b) \wedge (c = 0).(a&b)=(b∣c)=(c⊕a)⟺(a=b)∧(c=0).

Proof. (⇒)(\Rightarrow)(⇒) aaa, bbb, ccc를 이진수로 생각한 뒤, 자릿수별로 나누어 분석하자. 먼저 aaa, bbb, 가 단일 비트를 가진 정수, 즉 또는 이라고 가정하자. 이때 가능한 를 다음과 같이 찾을 수 있다.

  • (a & b)=(b ∣ c)=(c⊕a)=0(a \,\&\, b) = (b \,|\, c) = (c \oplus a) = 0(a&b)=(b∣c)=(c⊕a)=0이라 가정하자. 이때, (b 이므로 이어야 한다. 또한 이고 이므로 이어야 한다. 따라서, 이어야 한다.

따라서, 위 조건을 만족하는 (a,b,c)(a, b, c)(a,b,c)는 (0,0,0)(0, 0, 0)(0,0,0)이나 (1,1,0)(1, 1, 0)(1,1,0)뿐임을 알 수 있다. 위와 같이 찾지 않고, 가능한 후보가 개뿐이므로 전부 시도해 보아도 된다.

aaa, bbb, ccc가 한 개보다 많은 비트를 가질 수 있는 일반적인 경우에 대해서 생각하면, 모든 비트 자리별로 위 조건이 성립해야 한다. 따라서 ccc는 모든 비트가 000이어야 하고, aaa와 bb는 비트끼리 값이 일치해야 된다. 이것은 , 이 모두 성립해야 한다는 뜻이다.

(⇐)(\Leftarrow)(⇐) 세 값을 모두 계산해 보면 aaa가 됨을 알 수 있다.

위 성질을 파악했다면, 이후는 ai=aja_i = a_jai​=aj​, ak=0a_k = 0ak인 서로 다른 세 인덱스 의 경우의 수를 구하는 문제와 같다. 수열에서 값이 인 수의 개수를 라 하자. 인 경우와 인 경우로 나누어 센다.

  • ai=0a_i = 0ai​=0인 경우, 총 c0(c0−1)(c0−2)c_0(c_0-1)(c_0-2)c0​(c가지 경우가 있다.

수열에 존재하는 모든 값에 대해 위의 값을 더하면 문제를 해결할 수 있다. 각 값의 개수를 세는 것은 정렬이나 std::map을 이용할 경우 O(nlog⁡n)O(n \log n)O(nlogn)에, std::unordered_map을 이용하면 O(n)O(n)O(n)에 가능하다.

cc
c
000
111
(a,b,c)(a, b, c)(a,b,c)
∣ c)=0(b \,|\, c) = 0
(b∣c)=0
b=c=0b = c = 0b=c=0
c=0c = 0c=0
(c⊕a)=0(c \oplus a) = 0(c⊕a)=0
a=0a = 0a=0
(a,b,c)=(0,0,0)(a, b, c) = (0, 0, 0)(a,b,c)=(0,0,0)
  • (a & b)=(b ∣ c)=(c⊕a)=1(a \,\&\, b) = (b \,|\, c) = (c \oplus a) = 1(a&b)=(b∣c)=(c⊕a)=1이라 가정하자. 이때, (a & b)=1(a \,\&\, b) = 1(a&b)=1이므로 a=b=1a = b = 1a=b=1이어야 한다. 또한 a=1a = 1a=1이고 (c⊕a)=1(c \oplus a) = 1(c⊕a)=1이므로 c=0c = 0c=0이어야 한다. 따라서, (a,b,c)=(1,1,0)(a, b, c) = (1, 1, 0)(a,b,c)=(1,1,0)이어야 한다.
  • 88
    8
    b
    a=ba = ba=b
    c=0c = 0c=0
    ​
    =
    0
    (i,j,k)(i, j, k)(i,j,k)
    vvv
    cvc_vcv​
    ai=0a_i = 0ai​=0
    ai≠0a_i \neq 0ai​=0
    0
    ​
    −
    1)(c0​−
    2)
  • ai=v≠0a_i = v \neq 0ai​=v=0인 경우, 총 cv(cv−1)c0c_v (c_v-1) c_0cv​(cv​−1)c0​가지 경우의 수가 있다.