ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Good Bye 2020 E】Apollo versus Pan

2021-02-14 08:01:04  阅读:203  来源: 互联网

标签:versus 10 Good int sum cin 60 ++ Apollo


题目链接

链接

翻译

题意很简单,让你求题目描述中那个离谱的式子。

题解

大概就是这样做了一下变换

然后我们就可以固定 \(j\),问题转换成快速求解 \(\sum_{i=1}^n(x_j\ \&\ x_i)\) 和 \(\sum_{i=1}^n(xj\ |\ xi)\)

如果我们设 \(f(i,j)\) 表示 \(i\) 这个数字的二进制从右往左数的第 \(j\) 个 \(bit\) 上的数字。

那么就有如下转换(\(M\)表示 \(x\) 的二进制表示位数最大值),一位一位地进行求解:

则问题变成求解 \(n\) 个数字的二进制上第 \(j\) 从 \(1\) 到 \(60\) 位的数字之和。

相反数的话用 \(n\) 去减一下就可以了。

时间有点紧张, 运行出来的时候 1993ms _(:з」∠)_

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
const int N = 5e5;
const int MOD = 1e9 + 7;
 
int T, n;
int v[N+10][60+10];
int sum[60 + 10];
 
int main() {
	#ifdef LOCAL_DEFINE
		freopen("in.txt", "r", stdin);
	#endif
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> T;
	while (T--){
        cin >> n;
        for (int i = 1;i <= n; i++){
            LL x;
            cin >> x;
            int j = 0;
            while (x > 0){
                v[i][j] = x%2;
                x /= 2;
                j++;
            }
            while (j < 60){
                v[i][j++] = 0;
            }
        }
        for (int j = 0;j < 60; j++){
            sum[j] = 0;
            for (int i = 1;i <= n; i++){
                sum[j] += v[i][j];
            }
        }
        LL ans = 0;
        for (int i = 1;i <= n; i++){
            LL pow2 = 1;
            LL temp1 = 0;
            LL temp2 = 0;
            for (int j = 0;j < 60; j++){
                temp1 += pow2*v[i][j]%MOD*sum[j]%MOD;
                temp2 += pow2*(n-(1-v[i][j])*(n-sum[j])%MOD)%MOD;
                temp1 %= MOD;
                temp2 = (temp2+MOD)%MOD;
                pow2 = pow2*2%MOD;
            }
            temp1 = temp1*temp2%MOD;
            ans = (ans + temp1)%MOD;
        }
        cout << ans << endl;
	}
	return 0;
}

标签:versus,10,Good,int,sum,cin,60,++,Apollo
来源: https://www.cnblogs.com/AWCXV/p/14401481.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有