概述

快速沃尔什变换,可以用来处理有关异或卷积的问题。

而异或运算,也就是二进制下的不进位加法运算,我们考虑能否将其拓展到高维。

也就是,在 \(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的更多相关文章

  1. 浅谈算法——FWT(快速沃尔什变换)

    其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...

  2. 转:浅谈Spectral Clustering 谱聚类

    浅谈Spectral Clustering Spectral Clustering,中文通常称为“谱聚类”.由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法. Spectral Cluste ...

  3. MCMC 浅谈

    # MCMC 浅谈 1. 采样(sampling)是什么 MCMC在采样算法中有着举足轻重的地位,那么什么是采样?采样就是根据某种分布生成样本.举个例子,线性同余发生器就是根据均匀分布生成样本,这就很 ...

  4. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  5. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  6. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  7. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  8. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  9. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  10. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

随机推荐

  1. 帮助编写异步代码的ESLint规则

    调试 JavaScript 中的异步代码有时就像在雷区中穿梭.你不知道 console.log 会在何时何地打印出来,也不知道代码是如何执行的. 你很难正确构造异步代码,使其按照你的意图以正确的顺序执 ...

  2. 【TouchGFX 】使用 CubeMX 创建 TouchGFX 工程时 LCD 显示为雪花屏

    经几个晚上折腾,修改大量的LTDC时钟.时序,FMC时序等,结果还是一样,耐心与好使的工程仔细对比,发现是时钟源配置问题,真是冤,聊以此以示纪念 实质上是没有分清有源和无源晶振 无源晶振又被叫做 谐振 ...

  3. 【TouchGFX】visua studio 自定义路径宏

    很好奇 touchgfx 的 visual studio 工程文件中路径符号 $(TouchGFXReleasePath)是哪里定义的,经查这就是一个宏替换 自定义宏方式  

  4. [转帖]07、kvm虚拟机的克隆

    操作前先关闭虚拟机 虚拟机的克隆 一.命令行克隆virt-clone(方法一) virt-clone -o vm1 -n vm2 -f /kvmdata/vm2.img 参数说明: -o:指定需要被c ...

  5. ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes

    ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes 背景 duckdb 是一个很流行的单机版数据库引擎 同事下载了相关的预 ...

  6. [转帖]实用小技能:一键获取Harbor中镜像信息,快捷查询镜像

    [摘要]一键获取Harbor中的镜像列表,无需登录harbor UI,也可批量下载镜像到本地并保存为tar包.本文已参与「开源摘星计划」,欢迎正在阅读的你加入.活动链接:https://github. ...

  7. 【转帖】python 安装whl文件

    前言 WHL文件是以Wheel格式保存的Python安装包,Wheel是Python发行版的标准内置包格式.在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的p ...

  8. [转帖]Linux文本处理三剑客sed详解(正则匹配、命令示例)

    https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK 简介: ...

  9. Gitlab使用说明

          零.gitlab简介   Gitlab是一个成熟的代码管理工具.为企业和组织提供内部的源代码的存储和管理功能.         一.gitlab角色总览   gitlab中的角色分管理员和 ...

  10. Ant Design Vue中Table对齐方式显示省略号

    Ant Design Vue中Table对齐方式显示省略号 <template> <!-- bordered 表示表格中的边框 pagination="false" ...