【题意】请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。

【算法】快速傅里叶变换(FFT)处理卷积

【题解】题目要求:

$$C_k=\sum_{i=k}^{n-1}A_i*B_{i-k}$$

令B'为B的数组反转,转化成和为定值的形式,即:

$$C_k=\sum_{i=k}^{n-1}A_i*B'_{n+k-1-i}$$

因为:

$$A_i=0,i\in[n,n+k-1]$$

$$B_{n+k-1-i}=0,i\in[0,k-1]$$

所以可以扩展式子的上下界,即:

$$C_k=D_{n+k-1}=\sum_{i=0}^{n+k-1}A_i*B'_{n+k-1-i}$$

这就可以用FFT处理卷积了。

复杂度O(n log n)。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=300010;
const double PI=acos(-1);
int n;
struct cp{double x,y;cp(double a,double b){x=a;y=b;}cp(){x=y=0;}cp operator + (cp a){return (cp){x+a.x,y+a.y};}cp operator - (cp a){return (cp){x-a.x,y-a.y};}cp operator * (cp a){return (cp){x*a.x-y*a.y,x*a.y+y*a.x};}
}a[maxn],b[maxn];
void fft(cp *a,int n,int f){int k=0;for(int i=0;i<n;i++){if(i>k)swap(a[i],a[k]);for(int j=n>>1;(k^=j)<j;j>>=1);}for(int l=2;l<=n;l<<=1){int m=l>>1;cp wn=(cp){cos(2*PI*f/l),sin(2*PI*f/l)};for(cp *p=a;p!=a+n;p+=l){cp w=(cp){1,0};for(int i=0;i<m;i++){cp t=p[i+m]*w;p[i+m]=p[i]-t;p[i]=p[i]+t;w=w*wn;}}}if(f==-1){for(int i=0;i<n;i++)a[i].x/=n;}
}
int main(){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf %lf",&a[i].x,&b[n-i-1].x);int N=1;while(N<n*2)N*=2;fft(a,N,1);fft(b,N,1);for(int i=0;i<N;i++)a[i]=a[i]*b[i];//2nfft(a,N,-1);for(int i=n-1;i<2*n-1;i++)printf("%d\n",(int)(a[i].x+0.1));return 0;
}

View Code

只要和为定值的形式就可以卷积,如果看着很奇怪就将其中一个数组下标变成i,然后扩展上下界。

转载于:https://www.cnblogs.com/onioncyc/p/8418113.html

【BZOJ】2194: 快速傅立叶之二相关推荐

  1. bzoj 2194 快速傅立叶之二

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 因为卷积的第 k 项是 sigma(i=0~k)a[ i ]*b[ k-i ] ,也就 ...

  2. 【刷题】BZOJ 2194 快速傅立叶之二

    Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...

  3. [BZOJ]2194: 快速傅立叶之二

    题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...

  4. bzoj2194 快速傅立叶之二

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 1730  Solved: 1026 [Submit][Status][D ...

  5. 解题报告(二)C、(darkBZOJ 2194) 快速傅立叶之二(FFT、卷积的概念、常用变换)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  6. BZOJ_2194_快速傅立叶之二_(FFT+卷积)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2194 给出序列\(a[0],a[1],...,a[n-1]\)和\(b[0],b[1],... ...

  7. bzoj2194: 快速傅立叶之二

    了解到了FFT求卷积,但是还是感性的认识.. 取反就可以了.输出一定要加int!!!! #include<cstdio> #include<iostream> #include ...

  8. BZOJ2194 快速傅立叶之二 【fft】

    题目 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 输入格式 ...

  9. BZOJ-2194 快速傅立叶之二

    FFT模版题. 观察题目,我们可以发现,只要把序列b倒过来,再联想一下乘法运算... 我们会发现,将序列a和序列b当作100进制数,做一次乘法,然后从低到高每一位便是答案了(乘完无需进位) #incl ...

  10. c语言二维图像傅立叶变换,C语言数据结构算法之实现快速傅立叶变换.pdf

    C语语言言数数据据结结构构算算法法之之实实现现快快速速傅傅立立叶叶变变换换 C语语言言数数据据结结构构算算法法之之实实现现快快速速傅傅立立叶叶变变换换 本实例将实现二维快速傅立叶变换,同时也将借此实例 ...

最新文章

  1. poj1503(高精度模拟加法)
  2. python写入csv文件的几种方法
  3. Android中SearchView修改字体颜色
  4. 【杂谈】有三AI的一对一永久技术答疑服务,我们至少不会跑路
  5. J2CL –迟到总比不到好
  6. 前端学习(2987):vue+element今日头条管理--案例演示
  7. ssm_layui_billmanagersystem账单管理系统(全栈开发)
  8. 第十三周项目1-数组大折腾(一)
  9. ECMAScript5新增Array方法forEach的实现
  10. Django ORM models操作
  11. Ubuntu 问题合集
  12. 年入百万的表弟给我上一课:互联网思维该怎么接地气
  13. EdrawMax思维导图,EdrawMax组织结构图
  14. java的json解析工具_json在java中的几种解析工具的使用
  15. CNVD和CNNVD披露漏洞教程(个人申报)
  16. WPF实现DoEvents
  17. Spring框架介绍
  18. 【python爬虫】Python爬取下载巨潮网指定公司的年报pdf
  19. 勒索软件频繁升级,了解常见勒索软件很有必要
  20. 分享我见到的培训面试和就业的情况(同时给出建议)

热门文章

  1. ListView,GridView的getView多次调用问题
  2. 微信小程序实现商品数量加减案例
  3. 2.项目介绍,数据库迁移(code first)
  4. php练手的项目,learnphp.beginmaker.com
  5. layui时间选择30分钟为单位_layui 时间选择器实现季度选择器
  6. Golang1.71.3下载以及安装(Linux Mac Windows)
  7. 如何使用Navicat给表设置唯一索引
  8. vue cli3.0 解决跨域问题和axios等问题,配合Django
  9. 用MediaCreationTool制作WINDOWS10安装U盘
  10. apt搜索某个软件及版本