当前位置: 首页 > news >正文

第八届传智杯复赛第二场 题补bxg25-27 或许要期待明天

一、题意解释

子数组是类似字符串的子串,必须连续。题目要求求所有子数组的按位或的和。按位或就是把两个数二进制表示,对应的位进行或,只要有一个是1,那么就是1(只有全0才为0)。

二、思考思路

我们先考虑暴力,枚举所有的起点和终点,再枚举每一个数与他后面数的或,然后求和,时间复杂度来到了O(n^4),不可取。按位或,我们能不能也按位来操作呢?如果我们对每个数的第i位进行操作,取得了这个位置的贡献,那一直累加到最高位不就成功了吗?ai最大为1e9,不到30位,那么时间复杂度是O(k*n),其中k为最高位且不超过30

对于或运算,只要有1那么左右包含这个数的子数组在这个位都有贡献,如果我们找1(第i个数第k位为1),会很麻烦,因为有1,它会在其他所有包含这个数的子数组中做贡献,而其他数在此位也为1(第j(j != i)个数的第k位也为1),那他俩都做贡献,而一个位在一个子数组只能贡献一次,我们难道还需要一直去重吗?这又要多少时间复杂度?这时候,想到:“正难则反”!

取1这么麻烦,那我们试试取0!只有这个子数组中第k位全部为0,第k位贡献才为0!

所以我们计算出所有第k位为0的子数组数量m,用全部子数组数量sum减去m,这就是所有k位有贡献的子数组的数量,再乘上2^k(2的k次幂),就是k位的贡献。我们现在只需要计算出sum和每个m就能构造代码了。

计算sum和m的公式是类似的,当我们左起点选择l时,右终点只有n-l+1种选择(从l开始选到n)。也就是说:

  • l = 1时,r = 1~n,共n种选择;
  • l = 2时,r = 2~n,共n-1种选择;
  • l = 3时,r = 3~n,共n-2种选择;
  • ……
  • l = n时,r = n,共1种选择;

综上,选择数是一个首相为n,公差为-1,末项为1的等差数列,所以sum = (n+1)*n / 2;

对于m, m = (len+1)*len / 2;

如此我们可以构造代码

三、代码

#include <bits/stdc++.h> #define int long long using namespace std; const int mod = 1e9 + 7; int qpow(int a, int b) { int res = 1; while (b) { if (b & 1) { res = res*a % mod; } b >>= 1; a = a*a %mod; } return res; } signed main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; int n2 = qpow(2, mod-2); while (T--) { int n, ans = 0; cin >> n; vector<int> a(n, 0); for (int i = 0; i < n; i++) { cin >> a[i]; } int sum = n*(n+1) % mod * n2 % mod; for (int i = 0; i < 30; i++) { int len = 0, cnt = 0; for (int x : a) { if ((x >> i) & 1) { cnt = (cnt + len * (len+1) % mod * n2 % mod) % mod; len = 0; } else { len++; } } cnt = (cnt + len * (len+1) % mod * n2 % mod) % mod; int cnt1 = (sum - cnt + mod) % mod, w = 1 << i; ans = (ans + cnt1 * w % mod) % mod; } cout << ans << '\n'; } return 0; }

其中n2代表的是2的逆元,可以直接用/2(除2)代替,1 << i是2^i(2的i次幂)。

http://www.jsqmd.com/news/686805/

相关文章:

  • Kylin-Server-V11、openEuler-22.03和openEuler-24.03的MySQL 8.4.9版本正式发布
  • 室内空气质量监测装置厂家选购指南:避坑与筛选全攻略 - 速递信息
  • 别再只会点灯了!用STM32串口玩点高级的:OLED实时显示+双向通信实战
  • 超越中断:在国产ZYNQ的OCM里划块‘共享内存’,实现更高效的多核数据交换
  • 给DELL R730xd加装非认证PCIE固态后,风扇狂转?5分钟用IPMI命令搞定
  • 备案后别忘了这件事:手把手教你为阿里云已备案域名配置HTTPS(SSL证书)
  • AI Skills插件开发避坑指南:从环境搭建到上线
  • SchoolCMS:重构中小学校园数字化管理的开源技术架构
  • mysql添加一个用户
  • 从NRF24L01‘平替’到原生ESB:一个老项目无线模块升级的成本与性能实测
  • 结构体指针与动态数组实战指南
  • 2026年甘肃新疆等地带专用锁具的密封粮库门窗厂家推荐,靠谱品牌盘点 - mypinpai
  • 告别手动下载:用Homebrew管理你的Mac版ADB和Android平台工具链
  • 别再傻傻分不清SNR和EbN0了!通信仿真里的横坐标到底该用哪个?(附MATLAB代码避坑)
  • AI越强越值钱的3种反直觉能力,90%的工程师正在丢掉
  • LFM2-VL-1.6B与Proteus联调:嵌入式AI系统仿真案例
  • 5分钟掌握网盘直链下载助手:一键解锁八大平台高速下载通道
  • 铝木门铝材制造企业怎么选购,福建地区哪家值得考虑 - 工业品网
  • SAML单点登录实战:一次配置,搞定Okta和SAP SuccessFactors(SF平台)
  • 2026年选购废旧物资回收服务 昊盛废旧物资回收客户服务体系健全吗 - 工业推荐榜
  • 网络安全应急
  • 深度优化指南:ThinkPad风扇控制工具TPFanCtrl2的完整配置方案
  • JavaScript中对象属性存在的四种检测方法性能评估
  • 输入220V转5V 400mA简易非隔离降压转换芯片_AH8593
  • 从零到一:手把手教你用conda搞定GDAL和rasterio全家桶(Windows/Linux/macOS通用)
  • qmc-decoder:终极QQ音乐格式转换工具,3分钟解锁你的加密音乐收藏
  • Cloudflare漏洞事件解析与HTTPS数据泄露防护
  • Rust 宏展开过程分析与调试
  • Spring Boot 2.4+ 升级后,bootstrap.yml 配置突然失效?别慌,一个依赖搞定(附版本对照表)
  • AI 逆向分析国航 AirChina FECU 参数来源并实现离线生成