浅谈高维FWT
概述
快速沃尔什变换,可以用来处理有关异或卷积的问题。
而异或运算,也就是二进制下的不进位加法运算,我们考虑能否将其拓展到高维。
也就是,在 \(k\) 进制下的不进位加法卷积。
对于具体的某一位,我们的卷积方式就是:\(a_i\times b_j\to c_{(i+j)\bmod k}\)。
我们考虑有什么东西是能够在乘法的意义下做到对 \(k\) 取模的——单位根。
记 \(k\) 阶单位根为 \(\omega_k=e^{\dfrac{2i\pi}{k}}\) ,则 \(\omega_k^k=1\) 。
也就意味着 \(\omega_k^i\times\omega_k^j=\omega_k^{(i+j)\bmod k}\) ,如果使用单位根占位,我们就成功将 \(a_i\times b_j\) 的贡献给到了 \(c_{(i+j)\bmod k}\) 。
其实这个就是循环卷积的形式,我们一葫芦画瓢给出FFT中的范德蒙德矩阵:
\(\begin{bmatrix}1&1&1&\dots&1\\1&\omega_k^{1\times 1}&\omega_k^{1\times 2}&\dots&\omega_k^{1\times (k-1)}\\1&\omega_k^{2\times 1}&\omega_k^{2\times 2}&\dots&\omega_k^{2\times (k-1)}\\\vdots&\vdots&\vdots&\ddots&\vdots\\1&\omega_k^{(k-1)\times 1}&\omega_k^{(k-1)\times 2}&\dots&\omega_k^{(k-1)\times (k-1)}\end{bmatrix}\)
它的逆矩阵即为:
\(\frac{1}{k}\begin{bmatrix}1&1&1&\dots&1\\1&\omega_k^{-1\times 1}&\omega_k^{-1\times 2}&\dots&\omega_k^{-1\times (k-1)}\\1&\omega_k^{-2\times 1}&\omega_k^{-2\times 2}&\dots&\omega_k^{-2\times (k-1)}\\\vdots&\vdots&\vdots&\ddots&\vdots\\1&\omega_k^{-(k-1)\times 1}&\omega_k^{-(k-1)\times 2}&\dots&\omega_k^{-(k-1)\times (k-1)}\end{bmatrix}\)
这个就是我们每一层变换的矩阵,暴力变换的复杂度为 \(k^2n\log n\),如果换成FFT可以做到 \(kn\log n\log k\),但由于常数,并不建议使用。
但是有的时候,并不一定存在模意义下的单位根,所以我们就像FFT维护复数一样,考虑维护一个形如 \(\sum\limits_{i=0}^{k-1}a_i\omega_k^i\) 的式子,并对其进行加减乘运算,这样便可以解决单位根不存在的问题。
例题
[清华集训2016] 石家庄的工人阶级队伍比较坚强
我们如果记剪刀为 \(0\),石头为 \(1\),布为 \(2\);平局为 \(0\),被赢为 \(1\),赢为 \(2\),你会发现,所有的胜负关系都是满足模 \(3\) 意义下的加法的,所以我们考虑进行 \(3\) 进制下FWT。
我们记 \(f_{i,S}\) 表示 \(i\) 轮之后,策略为 \(S\) 的人的得分, \(g_S\) 表示在胜负状态为 \(S\) 的情况下的评分。则 \(f_{i,j}=\sum\limits_{a\oplus b=j}f_{i-1,a}g_b\),其中 \(\oplus\) 代表 \(3\) 进制下的不进位加法。
记 \(F=FWT(f_0),G=FWT(g)\),则最终 \(FWT(f_n)=FG^n\) 。
我们考虑维护 \(a+b\omega_3\) 的二元组,同时 \(\omega_3^2=-\omega_3-1\) ,即可使用模意义下的加减乘运算了,最后答案中必然满足 \(b=0\) ,输出 \(a\) 即可。
CF1103E Radix sum
题意:给定长为 \(n\) 序列 \(a\) ,问从中可重复选择 \(n\) 次选择出来的数做十进制下不进位加法求和的值为 \(p,p=0,1\dots n-1\) 的方案数为多少,答案对 \(2^{58}\) 取模, \(n\leqslant 100000\)。
记 \(f_{i,S}\) 表示选了 \(i\) 个数,十进制下不进位加法的结果为 \(S\) 的方案数,\(g_S\) 表示序列 \(a\) 中有多少个 \(S\) ,则 \(f_{i,j}=\sum\limits_{a\oplus b=j}f_{i-1,a}g_b\) ,其中 \(\oplus\) 为十进制下不进位加法,使用与上一题类似的快速幂求解即可。
使用十进制下FWT,直接暴力对每个数维护一个十元组 \((a_0,a_1\dots a_9)\) 表示 \(\sum\limits_{i=0}^9a_i\omega_{10}^i\) ,使用自然溢出对于 \(2^{64}\) 取模。
因为最后我们要乘上 \(\dfrac{1}{100000}\) ,又 \((2^{58}\times 32)|2^{64}\) ,存在 \(3125\) 在模 \(2^{58}\) 的意义下的逆元,处理后可求出最终答案。
浅谈高维FWT的更多相关文章
- 浅谈算法——FWT(快速沃尔什变换)
其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...
- 转:浅谈Spectral Clustering 谱聚类
浅谈Spectral Clustering Spectral Clustering,中文通常称为“谱聚类”.由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法. Spectral Cluste ...
- MCMC 浅谈
# MCMC 浅谈 1. 采样(sampling)是什么 MCMC在采样算法中有着举足轻重的地位,那么什么是采样?采样就是根据某种分布生成样本.举个例子,线性同余发生器就是根据均匀分布生成样本,这就很 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
随机推荐
- mybatis plus 获取新增实体的主键
转载请注明出处: mybatis plus 新增实体对象调用的是 IService 接口中的 save 方法: default boolean save(T entity) { return SqlH ...
- 【C/C++】sscanf函数和正则表达式
此文所有的实验都是基于下面的程序:char str[10];for (int i = 0; i < 10; i++) str[i] = '!';执行完后str的值为str = "!!! ...
- Spring Boot对接Oracle数据库
Spring Boot对接Oracle数据库 最近学习了Oracle数据库,那么如何使用Spring Boot和MyBatis Plus对接Oracle数据库呢? 这就有了这篇随记,具体流程如下 1. ...
- IBM jca 工具的学习与整理
IBM jca 工具的学习与整理 背景 发现自己最早看到IBM这个工具的时间是 2022年9月份. 但是一直没有进行过仔细的学习与论证. 本周出现了一个问题. 虽然通过gclog明显看出来是一个oom ...
- 不同数据库创建用户,数据库的SQL语句整理
不同数据库创建用户,数据库的SQL语句整理 MySQL mysql -uroot -p # 输入密码登录数据库 CREATE DATABASE IF NOT EXISTS xxxdata_somein ...
- [转帖]全球CPU市场格局(2022)
https://www.eet-china.com/mp/a222817.html 本文选自"2022年国产服务器CPU研究框架",重点分析2022年CPU产业链.CPU市场规模. ...
- [转帖]一个Linux 内核 bug 导致的 TCP连接卡死
https://plantegg.github.io/2022/10/10/Linux%20BUG%E5%86%85%E6%A0%B8%E5%AF%BC%E8%87%B4%E7%9A%84%20TCP ...
- 【转帖】AMD EPYC——CPU命名规则
AMD的三代服务器CPU都属于7000系列大锅,那么您如何知道要购买的产品呢? 只要看一下右边的最后一个数字,数字1代表第一代那不勒斯EPYC,数字2代表罗马型号,数字3代表新米兰产品. 始终从右到左 ...
- [转帖]Intel甘拜下风,挤牙膏比不过兆芯CPU
https://baijiahao.baidu.com/s?id=1735997557665412214 本文比较长,有万字左右,因此在前面先把小标题集中亮个相. 即使大家一晃而过,我也要让精心拟 ...
- [转帖]Linux使用Stress-ng测试CPU、内存、磁盘I/O满载情况教程与范例
https://www.xiaoyuanjiu.com/108301.html 介绍如何在 Linux 系统上使用 stress-ng 负载测试工具,产生 CPU.内存等资源满载的状况. stress ...