为了能到远方,脚下的每一步都不能少.|

Creeper_l

园龄:1年4个月粉丝:10关注:13

Sum of XOR Functions 题解

题意

给定一个数 \(n\) 和一个包含 \(n\) 个数的序列 \(a\),求出以下式子模 \(998244353\) 的值:

\(\sum_{i=1}^{n}\sum_{j=i}^{n} f(i,j)\times (j-i+1)\)

其中 \(f(i,j)\) 的值为 \(a_{i}\oplus a_{i+1}\oplus a_{i+2}\oplus...\oplus a_{j}\)

思路

首先我们可以考虑这道题的弱化版 P3917 异或序列,我们可以设 \(dp_{i,j}\) 表示第 \(i\) 个数的第 \(j\) 位对答案的贡献,也就是在 \(i\) 之前的每一个数的第 \(j\) 位有多少个数满足区间异或的值为一。那么我们考虑将每个 \(a_{i}\) 按照二进制位拆开,如果当前位置是 \(1\) 的话,那么 \(dp_{i,j}=i-dp_{i-1,j}\),因为只有前面的异或和为 \(0\) 时(所有数的数量减去异或和为 \(1\) 的数量),异或上当前位置的 \(1\) 答案才为 \(1\);否则如果当前位置的值是 \(0\),那么 \(dp_{i,j}=dp_{i-1,j}\),因为只有前面的异或和为 \(1\) 时,异或上当前位置的 \(0\) 答案才为 \(1\)

因为这里的每一个 \(dp_{i,j}\) 表示的是贡献的数量,所以还要乘上对应的值,也就是 \(2^{j}\),这样就可以得出答案了。注意 \(dp\) 数组可以滚掉一维,节省空间。

然后我们考虑这道题怎么做,其实比较好想了。我们可以对每一位计算贡献,对于每个数的每一位,可以多维护一个 \(s_{0,1}\) 表示 \(a_{1}\oplus a_{2}\oplus a_{3}\oplus...\oplus a_{i}\) 的值,\(cnt_{0/1}\) 表示有多少个数的 \(s_{j}\)\(1/0\)\(sum_{1/0}\) 表示所有 \(s_{j}\)\(0/1\) 的数到 \(1\) 的距离(也就是 \(j\))。然后每次加上相应的距离就行了。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define inf_db 127
#define ls id << 1
#define rs id << 1 | 1
#define re register
#define endl '\n'
typedef pair <int,int> pii;
const int MAXN = 3e5 + 10;
const int mod = 998244353;
int n,a[MAXN],s[MAXN],ans; 
signed main()
{
	cin >> n;
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 0;i <= 30;i++)
	{
		s[1] = 0;
		for(int j = 1;j <= n;j++) s[j + 1] = s[j] ^ (a[j] >> i & 1);
		vector <int> cnt(2, 0);
    	vector <int> sum(2, 0);
    	for(int j = 1;j <= n + 1;j++)
    	{
    		ans = (ans + cnt[s[j] ^ 1] * j % mod * (1ll << i)) % mod;
			ans = (ans - sum[s[j] ^ 1] * (1ll << i) + mod) % mod;
    		cnt[s[j]]++;
    		sum[s[j]] = (sum[s[j]] + j) % mod;
		}
		ans = ans % mod;
	} 
	cout << ans << endl;
	return 0;
}

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/17913426.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(18)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
在你的身边 - 盛哲
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起