luogu p6599 異或
luogu cf1352g special permutation
luogu cf1360f spy-string
有 \(t\) 組詢問,每次給定兩個正整數 \(n,l\)。
你需要構造乙個長度為 \(l\) 的正整數序列 \(a\)(編號從 \(1\) 至 \(l\)),
且滿足\(\forall i\in[1,l]\),都有 \(a_i\in[1,n]\) 求:
\[\sum_^l\sum_^a_i\oplus a_j
\]的最大值。
為了避免答案過大,對於每組詢問,只需要輸出這個最大值對 \(10^9+7\) 取模的結果。
\(in\)
1
2 3
\(out\)
6
\(in2\)
2
114 514
1919 180
\(out2\)
8388223
16580700
異或:兩個數按位運算,相同返回0,不同返回1。
題中的\[\sum_^l\sum_^a_i\oplus a_j
\]大意就是這樣:
int ans = 0;
for(i = 1 → l)
for(j = 1 → i-1)
ans += a[i] ^ a[j];
即選定乙個數,讓這個數分別和他後面的每乙個數字做異或運算,把得到的值加起來。現在要我們構造這麼乙個數列,使得這樣的結果最大。
把每個數字轉換成二進位制,瘋狂觀察:
125 = 1 1 1 1 1 0 1
67 = 1 0 0 0 0 1 1
89 = 1 0 1 1 0 0 1
101 = 1 1 0 0 1 0 1
我們可以發現,第k位對整個答案的貢獻應該是這一位0的個數乘以這一位1的個數。
當然因為在計算機裡面進行的是按位運算,最後別忘了乘以\(2^k\)。設0的個數是x,則貢獻就是:
\[2^k \times x \times (l - x)
\]根據二次函式的知識我們可以知道,要想讓這個東西取得最大值,x應當等於\(\frac l2\)。那麼我們只需要對每一位構造\(\frac l2\)個1,\(x - \frac l2\)個0,就能夠使得最終的答案最大。那麼就沒有必要知道每乙個數到底有多大,只需要判斷對高位在**就可以了。
long long t,l,n;
long long ans = 0;
int main()
long long f = 1ll << 40;
while(f)
printf("%lld\n",ans);
}return 0;
}
Luogu4551 最長異或路徑
emmmmmmmmmm異或乙個數兩次等於沒有操作對吧。所以我們按照字首的異或和,建乙個01trie。然後之後。直接在樹上貪心地找能和它每一位不一樣的數。然後。就沒有了吧qwqwq 如下 include include include include include define maxn 10001...
Luogu2420 讓我們異或吧
題目描述 異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上...
luogu2420 讓我們異或吧
這題就沒人用並查集嗎,我弱弱地問一句 然而是先並,後查的 建立乙個帶權並查集 g x 表示節點x到他直接父親的異或值 根據異或的可亂搞的性質 注意並查集一定要先getf一下 然後合併同根據異或可亂搞的性質 rt所示 mspaint真心毒瘤 查詢的時候先getf一下 然後直接g u g v 即可 in...