问题描述

校内评测链接

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

出题人生成了一个序列,其中第\(\)个元素为\(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. 【数值计算方法】线性方程组迭代算法的Python实现

    线性方程组迭代算法的Python实现 jacobi,GS,SOR迭代法 def JacobiIter(A:np.ndarray, b:np.ndarray, tol:float=1e-5, maxIt ...

  2. 【由技及道】量子跃迁部署术:docker+jenkins+Harbor+SSH的十一维交付矩阵【人工智障AI2077的开发日志011】

    摘要: SSH密钥对构建的十一维安全通道 × Harbor镜像星门 × 错误吞噬者语法糖 = 在CI/CD的量子观测中实现熵减永动机,使容器在部署前保持开发与生产维度的叠加态 量子纠缠现状(技术背景) ...

  3. Web前端入门第 8 问:HTML <!DOCTYPE> 申明有何用处?如果没有此申明有什么问题?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 先电脑端浏览器打开任何一个网页,比如百度. 再用 ctrl + u 快捷键即可查看源码,瞅瞅第一行代码,是不是都 ...

  4. ffmpeg合并时音画不同步问题及音频软编码实现记录

    最近因为耳机3.5mm接口的一些干扰问题,舍弃了之前的接入方式,需要重新实现网络音频流的接入,在这个过程中遇到了一些问题,特来记录一下~ 一.网络音频流的接入 这个音频流来源各不相同,我这里是udp广 ...

  5. ORACLE数据挖掘之 MSET-SPRT

    虽然是熟悉的Oracle数据库,但关于机器学习.数据挖掘这方面的知识笔者起初也是不了解的,文中MSET相关设置来源于同事提供的sample,在测试过程中边查资料边学习吸收,也因此看到了别样的Oracl ...

  6. Delphi字符串加密解密函数

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. Obsidian 笔记一键转换发布为 Jekyll 博客

    Obsidian 是一款功能强大且灵活的知识管理和笔记软件,与 Jekyll 这一轻量级静态博客框架的结合,既能保留 Obsidian 的网状知识关联优势,又能借助 Jekyll 的高效编译能力快速生 ...

  8. Python 生成器说明

    生成器 python 生成器 常规形态 # list def square_numbers(nums: list): squared_nums = [] for i in nums: squared_ ...

  9. 常见行为面试题-Why do you want to work here?

    Why do you want this job?/Why do you want to work here? Keys to answer the question Research the com ...

  10. 🎀Java-Exception与RuntimeException

    简介 Exception Exception 类是所有非致命性异常的基类.这些异常通常是由于编程逻辑问题或外部因素(如文件不存在.网络连接失败等)导致的,可以通过适当的编程手段来恢复或处理.Excep ...