大吉大利【牛客网】(牛客练习赛60)
傳送
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format:%lld
題目描述
輸入描述:
第一行一個整數n.
第二行n個整數ai.
輸出描述:
一個整數表示上述求和式的答案.
示例1
輸入
輸出
33備注:
1≤n≤1e5
0≤ai≤1e8
題解:
根據題意就能打出最簡單的暴力方法
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum+=a[i]&a[j];
復雜度O(n)肯定超時,這題也不可能這么水。
---------------------------------(此處為做題時錯誤想法)
我一開始這么想的a[i]&a[j] = = a[j]&a[i],所以j循環時從i+1開始就行,因為這個是對稱的,sum算完再*2,最后再加上對角線上的i = = j的情況,結果還是超時(捂臉 )
(以下為正解)
&啥性質?1&1=1,其余情況都為0
當1&2是,我們可以轉化成二進制運算,01&11=01
其實就是對應列&運算,
0 1
&
1 1
——
0 1
我們看樣例:
1 ->0 0 1
2 ->0 1 0
3 ->0 1 1
4 ->1 0 0
5 ->1 0 1
看第一列:
0
0
0
1
1
因為0&任何都是0,所以看1,第四五行有1,
那運算時第四行&第四行=1,第四行&第五行=1,接著第五行再分別與第五行和第四行&運算也是兩個1,最后加起來一共四個1.其實就是這一列1的數量的平方。你試試最后一列是不是也是這樣?
(其實這個就是模仿暴力方法的第二個for循環,i與每個j&運算)
那這樣算例題,結果就是
1 ->0 0 1
2 ->0 1 0
3 ->0 1 1
4 ->1 0 0
5 ->1 0 1
結果->4 4 9
這個449就可以理解成有4個100,4個010,9個001,因為咱們是用二進制運算,要轉換成十進制,
100對應的就是4 =22
010對應的就是2 =21
001對應的就是1 =20
二進制轉換成十進制時要乘以對應位置2的n次方,就是4 * 22 + 4 * 21 + 9 * 20=33
33就是最后結果(各位想明白了嗎? )
代碼
總結
以上是生活随笔為你收集整理的大吉大利【牛客网】(牛客练习赛60)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小G的项链(Manacher)
- 下一篇: 三级域名怎么解析(三级域名怎么解析腾讯云