985的数学难题

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;
} 

注:^表示异或运算。

输入

第一行输入一个整数TT,代表有TTTT组测试数据。
每组数据第一行输入一个整数n代表元素个数,接下来一行输入nn个正整数a[i]。
注: 1<=T<=20    1<=n,a[]<=100000;
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long LL;
 6 
 7 const int maxn = 100005;
 8 
 9 LL wei(LL x)
10 {
11     LL k = 0;
12     while(x)      // 计算一个数的二进制位数;
13     {
14         k++;
15         x >>= 1;
16         //k++;
17     }
18     return k;
19 }
20 
21 int main()
22 {
23     int t;
24     scanf("%d",&t);
25     LL T[maxn];    //
26     LL a[maxn];
27     while(t--)
28     {
29         memset(T,0,sizeof(T));  //T[]表示一个数二进制各个位的1的个数;
30         //memset(a,0,sizeof(a));
31         LL n;
32         scanf("%d",&n);
33         LL Sum = 0;
34         LL ans = 0;
35         for(LL i = 0; i < n; i++)
36         {
37             scanf("%lld",&a[i]);
38             Sum += a[i];
39         }
40         sort(a,a+n);
41         LL _size = wei(a[n - 1]);                                        //求出最大数的二进制位数;                                         
42         //LL ans = 0;
43         for(LL i = 0; i < _size; i++)                                    //i表示二进制的位数; 
44         {
45             for(LL j = 0; j < n; j++)                                    //n个数进行操作;
46             {
47                 T[i] = (T[i] + (a[j] & 1));                              //统计每个位数上的1的个数;
48                 a[j] >>= 1;                                              //向右移位,统计下一位
;49             }
50             ans += (1 << i)*(T[i] * (n - T[i]) + T[i] * (T[i] - 1)/2);  //第i位的权重*(有1和0的情况+全是1的情况排列组合);
51         }
52         ans *= 2;
53         ans += (Sum * (n - 1));            //对于题中的二重循环,每次两个数相加,之后每个数相加了 n-1 次,
54         printf("%lld
",ans);
55     }
56     return 0;
57 }



/**********tips:
a^b + a&b = a|b;
***************/
1<=T<=201<=n,a[]<=100000

输出

对每组测试数据,输出一个整数代表最后的返回值ans

样例输入

2
1
10
2
1 1

样例输出

0
4
原文地址:https://www.cnblogs.com/zhaoningzyn/p/6561663.html