CF1466E Apollo versus Pan 题解
本题是一道数学题。
我们首先需要交换一下求和符号,然后利用二进制的性质拆式子即可。
具体过程如下:
于是我们只需要按二进制位拆分,然后处理即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 5e5 + 10, P = 1e9 + 7;
int t, n;
LL x[MAXN], ans, sum[MAXN];
LL read()
{
LL sum = 0, fh = 1; char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') fh = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {sum = (sum << 3) + (sum << 1) + (ch ^ 48); ch = getchar();}
return sum * fh;
}
int main()
{
t = read();
while (t--)
{
n = read(); ans = 0;
for (int i = 1; i <= n; ++i) x[i] = read();
memset(sum, 0, sizeof(sum));
for (int i = 1; i <= n; ++i)
for (int j = 0; j < 60; ++j)
if (1ll << j & x[i]) sum[j]++;
for (int i = 1; i <= n; ++i)
{
LL sum1 = 0, sum2 = 0;
for (int j = 0; j < 60; ++j)
{
LL tmp = (1ll << j) % P;
if (1ll << j & x[i]) sum1 = (sum1 + sum[j] * tmp % P) % P, sum2 = (sum2 + n * tmp) % P;
else sum2 = (sum2 + sum[j] * tmp) % P;
}
ans = (ans + sum1 * sum2 % P) % P;
}
printf("%lld\n", ans);
}
return 0;
}
标签:
基础数学题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具