zzulioj1893: 985的數學難題(二進位制計算)
Description
985有n個正整數,他想快速知道下面函式的返回值
int a[N+1];
long long Solve() {
int i, j;
long long ans = 0;
for(i = 1; i <= N; i++) {
for(int j = i + 1; j <= N; j++) {
ans += a[i] + a[j] + (a[i] ^ a[j]) + (a[i] | a[j]) + (a[i] & a[j]);
}
}
return ans;
}
注:^表示異或運算。
Input
第一行輸入一個整數t,代表有t組測試資料。
每組資料第一行輸入一個整數代表元素個數,接下來一行輸入n個正整數a[]。
注:1 <= t <= 30,1 <= n,a[] <= 100000。
Output
一個整數代表最後的返回值ans。
Sample Input
2
1
10
2
1 1
Sample Output
0
985有n個正整數,他想快速知道下面函式的返回值
int a[N+1];
long long Solve() {
int i, j;
long long ans = 0;
for(i = 1; i <= N; i++) {
for(int j = i + 1; j <= N; j++) {
ans += a[i] + a[j] + (a[i] ^ a[j]) + (a[i] | a[j]) + (a[i] & a[j]);
}
}
return ans;
}
注:^表示異或運算。
Input
第一行輸入一個整數t,代表有t組測試資料。
每組資料第一行輸入一個整數代表元素個數,接下來一行輸入n個正整數a[]。
注:1 <= t <= 30,1 <= n,a[] <= 100000。
Output
一個整數代表最後的返回值ans。
Sample Input
2
1
10
2
1 1
Sample Output
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,再根據位運算的性質進行計數即可。
程式碼:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int t,i;
int a[100010];
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
long long sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sum=(n-1)*sum;
sort(a+1,a+n+1,cmp);
long long m=1,ans;
while(a[1])
{
ans=0;
for(int i=1;i<=n;i++)
{
if(!a[i])
break;
if(a[i]&1)
ans++;
a[i]>>=1;
}
sum+=(ans*(n-ans)+((ans-1)*ans/2))*m*2;
m<<=1;
}
printf("%lld\n",sum);
}
return 0;
}
相關文章
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 二進位制與二進位制運算
- 計算機中的二進位制計算機
- 負數的二進位制數問題
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 位運算(一):二進位制中1的個數
- 二進位制轉float浮點數線上計算工具
- 二進位制、位運算、位移運算
- 位運算--求一個 數二進位制中1的個數
- java二進位制運算十進位制(精確運算)Java
- float線上轉二進位制計算器
- 數字邏輯練習題-(二進位制/16進位制模擬)
- 有趣的二進位制2—高效位運算
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- 輸出二進位制數
- N位二進位制數加減法運算圖靈機圖靈
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 計算機中為什麼要用二進位制計算機
- 十六進位制計算器
- JavaScript 二進位制數字轉換為十進位制JavaScript
- 題目1513:二進位制中1的個數
- 二進位制中1的個數
- 1417 二進位制數的大小
- ROP【二進位制學習】
- 用C#實現二進位制的減法(包括二進位制小數)C#
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 計算機求解10進位制轉換任意進位制計算機
- 二進位制數的運算原理與閘電路實現
- 進位制詳解:二進位制、八進位制和十六進位制
- javascript十進位制數字和二進位制相互轉換JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 用c語言實現輸入一個十進位制數,計算其轉換為二進位制數後其中包含1的個數C語言
- 從零構造一臺計算機——二進位制計算機
- 十六進位制減法計算