luogu整理 P6599 異或

2022-05-05 16:27:08 字數 1474 閱讀 2122

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...