• 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
  • 相关阅读:
    nginx 启用php解析及解决无法访问报错Primary script unknown的过程
    百度云服务器连接码云的坑
    async函数测试
    centos6.8安装mysql5.7及用navicat远程连接
    JavaScript模块知识理解
    为什么if else 语句里不能用函数声明定义函数,而可以用函数表达式定义函数
    Java8-对map过滤
    git cherry-pick 的使用
    Java8-对map排序
    Java8过滤器(Filter)
  • 原文地址:https://www.cnblogs.com/zhaoningzyn/p/6561663.html
Copyright © 2020-2023  润新知