问题描述

校内评测链接

良心出题人准备为大家送出大量的分数。

出题人生成了一个序列,其中第\(\)个元素为\(a_i\)。

定义一个集合\(\)的分值为

\[F(S,x) = \sum_{T \subseteq S} G(T)·x^{|T|}
\]

其中为给 定参数,()表示中所有元素的异或和,空集的异或和为0。 出题人每次会选择一个区间\([, ]\)和一个参数\(\),令第\(\)到第\(\)个元素组成的集合为\(\),出题人会送给一位同学\((, )\)的分数。 你想知道每个同学获得了多少分数,因为分数实在太多了, 你只想要知道分数对\(998244353\)取模后的结果。

题意简述

给一个序列a,设一个区间S分值为

\[F(S,x) = \sum_{T \subseteq S} G(T)·x^{|T|}
\]

有m个询问,每次给\(l\),\(r\),\(x\),求\(F([l,r],x)\)

即,求给定区间内的所有集合的异或和*\(x^{集合大小}\)

集合为可重集合。

分析

因为式子中有一个集合大小的贡献,所以无法预处理,只能直接搞。

考虑拆位,设这个区间长度为\(n\),区间内的第k位有\(m\)个\(1\)。

若\(1\)的个数为偶数,则没有贡献。而\(0\)的贡献很好求,虽然不会对答案有直接影响,但是充当了集合的大小的一部分,所以它的贡献是一个系数。

可以计算出贡献:

\[\sum_{i=0}^{n-m}\sum_{j \nmid 2}^m{C_{n-m}^i \cdot x^i \times C_m^j \cdot x^j}
\]

将无关项分离:

\[\sum_{i=0}^{n-m}{C_{n-m}^i \cdot x^i }\times { \sum_{j \nmid 2}^m C_m^j \cdot x^j}
\]

观察到形如二项式定理

\[\sum_{i=0}^n {C_n^i \cdot x^i} = (x+1)^n
\]

的两个式子,左边的可以用二项式定理直接变成\((x+1)^n\),即

\[(x+1)^n = { \sum_{j \nmid 2}^m C_m^j \cdot x^j}
\]

那么右边的这个\(j \texttt{ mod } 2 ==1\)怎么转化呢?类似共轭,

\[(1+(-x))^n=\sum_{i=0}^n {C_n^i \cdot (-x)^i}
\]

两式相减

\[(x+1)^n-(-x+1)^n=2 \sum_{i \nmid 2} {C_n^i \cdot x^i}
\]

成功了!再除以\(2\)就是右半部分了。

所以答案就是

\[(x+1)^{n-m} \cdot \frac{(x+1)^m-(1-x)^m}{2}
\]

用前缀和计算区间内第\(k\)位上\(1\)的个数\(m\),再加上快速幂就好了,记得\(\texttt{long long}\),取模,除以\(2\)的话记得用逆元

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define p 998244353
#define IL inline
#define re register
#define LL long long
#define ULL unsigned int
#define re register
#define debug printf("Now is %d\n",__LINE__);
using namespace std; template<class T>inline void read(T&x)
{
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
}
inline int read()
{
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do{G[++g]=x%10;x/=10;}while(x);
for(re int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
int a[100010];
LL sum[100010][32];
int n;
int m;
LL qpow(LL a,LL b)
{
int ans=1;
for(;b;b>>=1,a=a*a%p)
if(b&1) ans=ans*a%p;
return ans;
}
int main()
{
n=read();
m=read();
for(LL i=1;i<=n;i++)
{
a[i]=read();
for(int j=30;j>=0;j--)
sum[i][j]=sum[i-1][j]+((a[i]>>j)&1);
}
for(LL l,r,x,i=0;i<m;i++)
{
l=read();
r=read();
x=read();
LL ans=0;
for(LL j=30;j>=0;j--)
{
LL N=r-l+1ll,M=(sum[r][j]-sum[l-1ll][j]+p)%p;
ans=(ans+(1ll<<j)%p*qpow(x+1ll,N-M)%p*(qpow(x+1ll,M)+p-qpow((1ll-x+p)%p,M))%p*qpow(2,p-2)%p)%p;
}
cout<<ans<<endl;
}
return 0;
}

结语

多取模啊!多取模!不然的话就会……

校内NOI模拟测试007T1 送分(score) “简单”的计数的更多相关文章

  1. [CSP-S模拟测试]:砖块(模拟)

    题目描述 在一个二维网格平面上,一个网格的坐标由其左下角的点的坐标定义$(x,y)$.在一个二维网格平面上,一个网格的坐标由其左下角的个点的坐标定义$(0,0)$的区域中,此时存在高度为$k$的初始砖 ...

  2. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  3. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  4. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  5. 模拟websocket推送消息服务mock工具二

    模拟websocket推送消息服务mock工具二 在上一篇博文中有提到<使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock>使用electron创建一个模拟后 ...

  6. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  7. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  8. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  9. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  10. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

随机推荐

  1. 地球OL攻略 —— 某应届生求职总结

    某应届生的苦逼求职总结 1.自我介绍,阐述一下自己过去的情况 2.目前的就业情况以及从事的就业方向 3.你在面试的时候遇到什么困难?是怎么帮忙解决的 4.当初为什么会选择选择这一行? 5.分享一下学习 ...

  2. 当你在浏览器中输入 google.com 后按下回车发生了什么?

    按下"g"键 接下来的内容介绍了物理键盘和系统中断的工作原理,但是有一部分内容却没有涉及.当你按下"g"键,浏览器接收到这个消息之后,会触发自动完成机制.浏览器 ...

  3. 【虚拟机】在VMware中为Ubuntu虚拟机设置共享文件夹

    [虚拟机]在VMware中为Ubuntu虚拟机设置共享文件夹 零.需求 有些开发工具在Windows上没有,只能在Ubuntu上开发,但是自己电脑是Windows的,开发完成后需要通过Windows分 ...

  4. access的多个left outer join连接

    虽然你有一万个理由,但是选择ACCESS数据库就是一个不能再蠢的决定. 从AC990账务系统中采集凭证记录,需要做多个左连接.在sql server管理器中执行蛮好,没有问题.可是在程序中就一堆Err ...

  5. Dubbo 中的集群容错

    前言 在微服务架构中,服务间的依赖关系复杂且动态,任何一个服务的故障都可能引发连锁反应,导致系统雪崩.一个好的容错设计可以避免这些问题发生: 服务雪崩效应:单个服务崩溃或响应延迟可能导致调用链上的所有 ...

  6. lua三色标记的读写屏障理解

    起因是已经被标记为黑色的对象无法进行再次遍历,然而黑色对象发生了引用变化:断开了引用或者引用了别的对象,会导致多标(不再被黑色对象引用的对象未能回收),漏标(黑色对象的新引用未能遍历标记)

  7. 康谋方案 | ADAS时空融合数据采集方案

    自动驾驶技术的飞速发展,正在重新定义未来出行的边界.从感知到决策,从规划到控制,每一个环节都离不开海量.精准的高质量数据支撑.然而,随着传感器数量的增加和数据规模的指数级增长,行业正面临一系列挑战:多 ...

  8. MySQL 中如果发生死锁应该如何解决?

    MySQL 中如果发生死锁应该如何解决? 死锁是指多个事务在执行过程中因资源争用形成的循环等待,导致无法继续执行.MySQL 会自动检测死锁并选择一个事务进行回滚,但我们可以通过优化设计和操作来避免和 ...

  9. GPFS并行文件系统部署实践

    环境 ubuntu22.04 试用版下载链接 https://www.ibm.com/cn-zh/products/storage-scale 我的版本:Storage_Scale_Developer ...

  10. idea添加类或方法快捷键的方法

    前言: 使用idea有过一段一段时间了,每次写完方法需要都需要注释,要么手动注释要么用快捷键(/** 回车)默认模板注释,不符合项目规定的注释要求,于是想了想是不是设置自定义的注释模板,上网查了资料整 ...