浅谈高维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的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
随机推荐
- 从零开发一款图片编辑器(使用html5+javascript)
最近开发了一个图片编辑器,类似于photoshop的网页版,源码参考自GitHub上,顺便也总结下使用html+js开发一个编辑器需要用到哪些知识点. 预览地址: https://ps.gitapp. ...
- AHB2APB设计
AHB2APB Bridge位置 AHB子系统时钟在200Mhz左右,APB时钟在几十Khz到几十Mhz 所以要进行跨时钟域处理,从AHB高时钟频率转到APB低时钟频率 AHB2APB Bridge规 ...
- [转帖]datax安装+配置+使用文档
1 DataX离线同步工具DataX3.0介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hiv ...
- Ergonomics JVM 的一种FullGC的说明
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html 2 Ergonomics Ergo ...
- shell补遗_一个巨简单的保证服务存活的脚本
Shell补遗 背景 公司一台机器总是会在没有更新补丁的情况下启动失败. 查看所有的配置都没有问题. 但是就是不启动 没办法,准备写一个检查进行启动. 最近写shell很少. 所以总结一下. 思路 判 ...
- Python学习之十三_pip的学习
Python学习之十三_pip的学习 pip的含义 pip: pip is the package installer for Python. You can use pip to install p ...
- [转帖]linux 系统级性能分析工具 perf 的介绍与使用
目录 1. 背景知识 1.1 tracepoints 1.2 硬件特性之cache 2. 主要关注点 3. perf的使用 3.0 perf引入的overhead 3.1 perf list 3.2 ...
- [转帖]台积电3nm成功量产,稳了吗?
https://docs.pingcode.com/info/13836.html?p=13836 2023-01-19 资讯 21 原标题:台积电3纳米成功量产:未来与三星仍将决战鳍式场效晶体管(F ...
- Find 查找并且展示最近24小时内创建的文件信息
1. 命令为: find /gscloud/tools/patchinstall/patchfiles/ -maxdepth 1 -mtime 1 |cut -c40- >/deploy/pat ...
- JDK发布版本的总结
https://www.oracle.com/java/technologies/javase/8all-relnotes.html 从官网总结一下每个版本的发布日期 Java SE 8u141 Ad ...