题意
给定正整数 和一个非负整数序列 。
对于一个非空的序列 ,我们定义它的得分为:
这里 运算表示按位异或。
找到序列 的 个非空子序列的得分之和,对 取模。
首先考虑转化这个 次方,发现对于异或和很难用组合方面的知识转化,所以直接考虑对于每个 ,求 表示有多少长度为 倍数的子序列异或和等于 。总答案为 ,问题转化为求出 数组。
这个问题的形式很 ,更进一步,我们有 个幂级数 ,第 个幂级数 前只有 和 的位置有值,因为有 的限制,所以我们考虑把它的系数变成一个矩阵 ,因为 是一个线性变换,所以系数是整数还是矩阵都没有影响。
将每个 一遍后得到 ,将其点乘起来并 一遍后就得到了 了,时间复杂度 ,其中 是 的值域。
考虑优化上面这个做法,容易发现每个 中只有 和 的位置有值,分别是 和 ,其中 是单位矩阵。根据 运算的 的性质,,则可以发现 只有两种情况: 或 。所以最后点乘后得到的 一定为 ,且 。
先用 的 预处理出矩阵的值(其实根本不用推出这个矩阵),只需要记 和 ,然后用下面的递推式推导即可:
再推一个 ,这样得到了 的值了。
接下来考虑快速得到这个 ,根据 的性质,如果 为偶数,那么 就给 贡献了一个 。所以计算 的 ,实际上是在计数有多少 使得 为偶数。考虑使用 加速这一过程,记 表示有多少 ,使得 ,初始值 (因为初始的时候相当于序列长度只有 ),其中 。
基于 蝴蝶变换时的性质,当两边进行合并时刚好有 位不同,所以有转移(记 ,其中 为蝴蝶变换时的三个下标):
最后将 即可, 一遍就得到原来的 了,总时间复杂度 。
代码是贺的,就不放了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现