985的数学难题
Submit: 153 Solved: 35
SubmitStatusWeb Board
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
4
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 #define INF 0xfffffff 6 long long n,ans; 7 long long num[100000+11]; 8 bool cmp(int a,int b) 9 { 10 return a>b; 11 } 12 int main() 13 { 14 int i,T; 15 scanf("%d",&T); 16 while(T--) 17 { 18 scanf("%lld",&n); 19 ans=0; 20 for(i=1;i<=n;i++) 21 { 22 scanf("%d",&num[i]); 23 ans+=num[i]; 24 } 25 ans*=(n-1); 26 sort(num+1,num+n+1,cmp); 27 long long mul=1,ant; 28 while(num[1]) 29 { 30 ant=0; 31 for(i=1;i<=n;i++) 32 { 33 if(num[i]&1) //计算从右往左每一位上,n个数字1和个数 34 ant++; 35 num[i]>>=1; 36 } 37 ans+=2*(((n-ant)*ant+(((ant-1)*ant)>>1))*mul);/* a|b=a^b+a&b;所以二倍或;也可分别求出异或和与 38 ans+=(((ant-1)*ant)>>1)*mul; 与运算,所有的这位数为1的数相结合 39 ans+=((n-ant)*ant)*mul;异或运算,这一位为0的和这一位为1的相结合 */ 40 mul<<=1;//二进制转为十进制的时候需要*2的n次方、 41 } 42 printf("%lld\n",ans); 43 } 44 return 0; 45 }