概述

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

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

也就是,在 \(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. 传说中 PUE 预测精度高达 0.005 的工作

    杨震, 赵静洲, 林依挺 等. 数据中心 PUE 能效优化的机器学习方法. 系统工程理论与实践, 2022, 42(3): 811-832 省流: 这是 2020 年的论文,用神经网络进行了认真的 P ...

  2. Synchronized的使用及原理总结

    本文为博主原创,未经允许不得转载 Synchronized的使用总结:   1.作用 原理 synchronized 的锁膨胀升级过程 对象的内存布局 锁的消除及逃逸分析 synchronized的方 ...

  3. 【C++】const 常类型

    常引用 格式:const 类型说明符 &引用名 注意:常引用所引用的对象不能修改 常对象 格式:类名 const 对象名 或 const 类名 对象名 注意:常对象其数据成员在生存期内不能修改 ...

  4. printf 函数格式控制

    Printf()介绍 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出.标准输出,即标准输出文件,对应终端的屏幕.printf()申明于头文件stdio.h. 函数原型: in ...

  5. IL合集二

    引言 在第一篇关于IL的文章中,我们写了一些IL的相加,创建对象,循环以及实现TryCatch的一些功能,接下来,为大家带上后续关于IL的更新,其中包括,类型转换,以及条件判断,还有定义字段,定义属性 ...

  6. 【ES系列】(一)简介与安装

    首发博客地址 首发博客地址 系列文章地址 教学视频 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了 ...

  7. [转帖]Nginx内置变量以及日志格式变量参数详解

    https://www.cnblogs.com/wajika/p/6426270.html $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求 ...

  8. [转帖]什么是内存屏障? Why Memory Barriers ?

    要了解如何使用memory barrier,最好的方法是明白它为什么存在.CPU硬件设计为了提高指令的执行速度,增设了两个缓冲区(store buffer, invalidate queue).这个两 ...

  9. [转帖]Grafana+influxdb+ntopng简易网络流量分析展示系统

    Grafana逼格高,所以用它展示ntopng的数据 >_< 一,ntopng 根据官网资料 https://www.ntop.org/ntop/ntopng-influxdb-and-g ...

  10. [转帖]linux中批量多行缩进与添加空格

    用vim打开修改python脚本的时候,将代码整体向后移动4个空格操作如下: ESC之后,ctrl+v进入多行行首选中模式 使用上下键进行上下移动,选中多行行首 shift+i,进入插入模式 连续敲击 ...