問題描述
《審美的歷程》課上有n位學生,帥老師展示了m幅畫,其中有些是梵高的作品,另外的都出自五歲小朋友之手。老師請同學們分辨哪些畫的作者是梵高,但是老師自己並沒有答案,因爲這些畫看上去都像是小朋友畫的……老師只想知道,有多少對同學給出的答案完全相反,這樣他就可以用這個數據去揭穿披着皇帝新衣的抽象藝術了(支持帥老師_)。
答案完全相反是指對每一幅畫的判斷都相反。
分析:0,1相反異或^即可。
思路:用二進制表示每位同學的回答(狀壓)。(m<=20;2^20 在int的範圍內)。相反的答案用二進制與m個1,1,1…1(即2^m-1)的數maxn取異或即可。(如 01 == 1 ,10 == 2,2^3 == 1(異或),1^3 == 2 )。
n, m = map(int, input().split())
d = {}
for i in range(n):
num = 0
x = input().split()
for j in x:
num = (num << 1) + int(j)
d[num] = d.get(num, 0) + 1
ans = 0
max = (1 << m) - 1
mid = max // 2
for i in d:
if mid < i:
continue
ans += d[i] * d.get(max ^ i, 0)
print(ans)
樣例輸入
3 2
1 0
0 1
1 0
樣例輸出
2
樣例說明
同學1和同學2的答案完全相反;
同學2和同學3的答案完全相反;
所以答案是2。
數據規模和約定
對於50%的數據:n<=1000;
對於80%的數據:n<=10000;
對於100%的數據:n<=50000,m<=20。