热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【笔记】卷积

HDU46093-idiots题目链接题解这个题考察了如何转化成多项式乘法,然后去重和计数很有意思HDU1402A*Bproblemplus题目链接将整数转化成向量,最后得到的卷积
  • HDU 4609 3-idiots
    题目链接
    题解
    这个题考察了如何转化成多项式乘法,然后去重和计数很有意思
  • HDU 1402 A*B problem plus
    题目链接
    将整数转化成向量,最后得到的卷积后的向量处理一下每一位的进位就是结果
  • BZOJ 2194 快速傅立叶之二
    题目链接
    FFT 能解决形如 c[k] =sigma(a[p]*b[k-p]) (0<=p<=k) 的式子,如果是c[k] = sigma(a[p],b[p+k]),可以将其中一个向量倒过来,这样就变成第一种情况了,当然所求的下标也变化了
  • BZOJ 3527 力
    题目链接
    公式推导
    和BZOJ2194类似,我们要将原式转化成c[k] =sigma(a[p]*b[k-p]) (0<=p<=k) , 熟练运用换元法、缩放和向量转置,得到满足卷积条件的表达式
  • BZOJ 3771 Triple
    题目链接
    容斥分析
    这道题考点在于是否了解DFT、IDFT之后求的是什么东西,只要心里清楚,就很容易做了

什么是卷积

参考资料1
参考资料2
【笔记】 卷积
多项式乘法就是求卷积
1 3 3 4
把这个数组转化成num数组,num[i]表示数字i的有num[i]个。
num = {0 1 0 2 1}
代表0的有0个,1有1个,2有0个,3有2个,4有1个。
使用FFT解决的问题就是num数组和num数组卷积。
num数组和num数组卷积的解决,其实就是从{1 3 3 4}取一个数,从{1 3 3 4}再取一个数,他们的和每个值各有多少个
例如:
{0 1 0 2 1}{0 1 0 2 1} 卷积的结果应该是{0 0 1 0 4 2 4 4 1 }
长度为n的数组和长度为m的数组卷积,结果是长度为n+m-1的数组。
{0 1 0 2 1}
{0 1 0 2 1} 卷积的结果应该是{0 0 1 0 4 2 4 4 1 }。
这个结果的意义如下:
从{1 3 3 4}取一个数,从{1 3 3 4}再取一个数
取两个数和为 2 的取法是一种:1+1
和为 4 的取法有四种:1+3, 1+3 ,3+1 ,3+1
和为 5 的取法有两种:1+4 ,4+1;
和为 6的取法有四种:3+3,3+3,3+3,3+3,3+3
和为 7 的取法有四种: 3+4,3+4,4+3,4+3
和为 8 的取法有 一种:4+4

关于多项式
  • 次数界:对于多项式A(x),系数为ai,设最高非零系数为ak,任何大于k的整数都是A(x)的次数界
  • 系数表达式: 【笔记】 卷积
  • 系数向量:a=(a0,a1,...,an−1)
  • 点值表达方式:{(x0,y0),(x1,y1),...,(xn−1,yn−1)} ,其中xk各不相同,yk=A(xk)

快速傅立叶变换(FFT)

快速计算DFT(离散傅里叶变换)的算法
时间复杂度:O(nlogn)

复数

const double pi = acos(-1);
const double pi_2 = 2*pi;
struct Complex // 复数
{
    double r, i;
    Complex(double _r = 0, double _i = 0) :r(_r), i(_i) {}
    Complex operator +(const Complex &b) {
        return Complex(r + b.r, i + b.i);
    }
    Complex operator -(const Complex &b) {
        return Complex(r - b.r, i - b.i);
    }
    Complex operator *(const Complex &b) {
        return Complex(r*b.r - i*b.i, r*b.i + i*b.r);
    }
};

FFT模板

  • 非递归
void func1(Complex pos[],int n){
    int j = __builtin_ctz(n)-1;
    for(int i=0;i>1]>>1 | ((i&1)<

步骤

  • 补0
    在两个多项式前面补0,得到两个2n次多项式,设系数向量分别为v1和v2。
  • 求值
    使用FFT计算f1=DFT(v1)和f2=DFT(v2)。则f1与f2为两个多项式在2n次单位根处的取值(即点值表示)。
  • 乘法
    把f1与f2每一维对应相乘,得到f,代表对应输入多项式乘积的点值表示。
  • 插值
    使用IFFT计算v=IDFT(f),其中v就是乘积的系数向量。
while(len 

快速数论变换(NTT)

当FFT需要取模P且P存在原根时,就能用NTT来求卷积
原根的知识见离散对数
NTT用到的部分素数及原根
如果不在表中可以自行计算

const int N = 1000;
bool not_prime[N+5];
int prime[N+5],tot_prime,pr[N+5],tot_pr;
int g;
void sss(){ 
    for(int i=2;i=N) break;not_prime[t]=true;
        if(i%prime[j]==0)break;
    }
    }
}
void get(int p){    int temp=p-1;
    for(int i=1;i<=tot_prime&&prime[i]*prime[i]<=temp;i++)
    if(temp%prime[i]==0){
        while(temp%prime[i]==0) temp /= prime[i];
        pr[++tot_pr] = prime[i];
    }
    if(temp>1) pr[++tot_pr]=temp;
}
bool check(int d,int p){ 
    if (__gcd(d,p)!=1)return 0;
    for(int i=1;i<=tot_pr;i++)if(qpow(d,(p-1)/pr[i])==1)return 0;
    return 1; 
}
int get_g(int p) {
    int g=1;
    sss();get(p);
    for(int i=2;i

ntt的接口使用和fft 类似,长度一定是2的幂次倍

int rev(int x,int r) {
    int ans=0;
    for(int i=0;i>1);j++) {
                ll t = w * a[k+j+(m>>1)] % mod;
                ll u=a[k+j];
                a[k+j] = (u+t)%mod;
                a[k+j+(m>>1)] = (u-t)%mod;if(a[k+j+(m>>1)]<0)a[k+j+(m>>1)]+=mod;
                w = w*wn%mod;
            }
        }
    }
    if(on==-1) {
        for(int i=1;i<(n>>1);i++) swap(a[i],a[n-i]);
        ll inv = qpow(n,mod-2);
        for(int i=0;i

推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
沉醉不知归路1222
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有