Problem B 985的數學難題(位運算)

2021-07-16 12:14:04 字數 1363 閱讀 9702

time limit: 2 sec  

memory limit: 128 mb

submit: 165  

solved: 40

submit

status

web board

985有n個正整數,他想快速知道下面函式的返回值

int a[n+1];

long long solve() }

return ans; }

注:^表示異或運算。

第一行輸入乙個整數t,代表有t組測試資料。

每組資料第一行輸入乙個整數代表元素個數,接下來一行輸入n個正整數a。

注:1 <= t <= 30,1 <= n,a <= 100000。

乙個整數代表最後的返回值ans。

2110

21 1

0

4

x^y+x&y==x|y

考慮二進位制的每一位對結果的影響

比如1101、1001、1010進行上述運算

則可發現

從右到左每一位上有1的個數記為

cnt[0]~cnt[3]分別為

2、1、1、3

因為或運算除了0|0==0

其餘都為1

也就是0|1+1|1

所以對於最右邊運算後有效的1個數

為 cnt[0]*(n-cnt[0])+(cnt[0]*(cnt[0]-1))/2

而這些1所代表的個數要轉變為十進位制

則要乘上其對應的1<<0

所以核心**為

[cpp]view plain

copy

print

?for

(int

i=0; i

res+=(1

其中lx代表最大數的二進位制位數

至於求a[i]+a[j]

只需要把a[1~n]相加求和之後乘(n-1)

也就是每個數用了n-1次

#include#include#includeusing namespace std;

long long a[100200];

int main() {

int t;

scanf("%d",&t);

while(t--) {

int n;

scanf("%d",&n);

for(int i=0; i>lx!=0; lx++)

for(int i=0; i>lx&1][lx]++;

long long res=0;

for(int i=0; i

985系列 985的方格難題

time limit 1 sec memory limit 128 mb submit 450 solved 99 submit status web board 985走入了乙個n n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從 1,1 走到 n,n 每次只可以向下或者向右走一步,問他能...

985的買飲料難題

time limit 1 sec memory limit 128 mb submit 221 solved 118 submit status web board 天氣太熱了,985制定了對未來的規劃即第i天喝a i 瓶飲料。為了節約開支,他打聽到了第i天每瓶飲料的 p i 為了不讓自己的規劃落空...

985的買飲料難題

time limit 1 sec memory limit 128 mb submit 233 solved 123 submit status web board 天氣太熱了,985制定了對未來的規劃即第i天喝a i 瓶飲料。為了節約開支,他打聽到了第i天每瓶飲料的 p i 為了不讓自己的規劃落空...