鄭輕 1893 985的數學難題

2021-07-16 03:45:32 字數 1195 閱讀 8053

time limit: 2 sec  

memory limit: 128 mb

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

所以核心**為

for(int i=0; i

其中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【鄭輕】[1893]985的數學難題

1893 985的數學難題

time limit 2 sec memory limit 128 mb submit 174 solved 43 submit status web board 985有n個正整數,他想快速知道下面函式的返回值 int a n 1 long long solve return ans 注 表示異或...

zzuli 1893 985的數學難題

time limit 2 sec memory limit 128 mb submit 178 solved 44 submit status web board 985有n個正整數,他想快速知道下面函式的返回值 int a n 1 long long solve return ans 注 表示異或...

鄭輕 1896 985的買飲料難題

time limit 1 sec memory limit 128 mb 天氣太熱了,985制定了對未來的規劃即第i天喝a i 瓶飲料。為了節約開支,他打聽到了第i天每瓶飲料的 p i 為了不讓自己的規劃落空,他想知道這n天他至少要花多少錢。精明的985可以選擇在任意一天買數目不限的飲料,而且他有乙...