BZOJ2194 快速傅立叶之二 【fft】
题目
请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。
输入格式
第一行一个整数N,接下来N行,第i+2..i+N-1行,每行两个数,依次表示a[i],b[i] (0 < = i < N)。
输出格式
输出N行,每行一个整数,第i行输出C[i-1]。
输入样例
5
3 1
2 4
1 1
2 4
1 4
输出样例
24
12
10
6
1
题解
和2179几乎一模一样
由于卷积的定义要求下标之和为常数,我们尝试将原式变形,发现只要将a或者b反过来存就可以了
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<complex>
#include<algorithm>
#define pi acos(-1)
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 400005,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - '0'; c = getchar();}return out * flag;
}
typedef complex<double> E;
E a[maxn],b[maxn];
int n,m,L,R[maxn];
void fft(E* a,int f){for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);for (int i = 1; i < n; i <<= 1){E wn(cos(pi / i),f * sin(pi / i));for (int j = 0; j < n; j += (i << 1)){E w(1,0);for (int k = 0; k < i; k++,w *= wn){E x = a[j + k],y = w * a[j + k + i];a[j + k] = x + y; a[j + k + i] = x - y;}}}if (f == -1) for (int i = 0; i < n; i++) a[i] /= n;
}
int main(){n = read(); n--;for (int i = 0; i <= n; i++){a[n - i] = read();b[i] = read();}m = n << 1; for (n = 1; n <= m; n <<= 1) L++;for (int i = 0; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));fft(a,1); fft(b,1);for (int i = 0; i <= n; i++) a[i] *= b[i];fft(a,-1);for (int i = (m >> 1); i >= 0; i--) printf("%d\n",(int)(a[i].real() + 0.1));return 0;
}
转载于:https://www.cnblogs.com/Mychael/p/8350641.html
BZOJ2194 快速傅立叶之二 【fft】相关推荐
- bzoj2194 快速傅立叶之二
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1730 Solved: 1026 [Submit][Status][D ...
- bzoj2194: 快速傅立叶之二
了解到了FFT求卷积,但是还是感性的认识.. 取反就可以了.输出一定要加int!!!! #include<cstdio> #include<iostream> #include ...
- BZOJ-2194 快速傅立叶之二
FFT模版题. 观察题目,我们可以发现,只要把序列b倒过来,再联想一下乘法运算... 我们会发现,将序列a和序列b当作100进制数,做一次乘法,然后从低到高每一位便是答案了(乘完无需进位) #incl ...
- 解题报告(二)C、(darkBZOJ 2194) 快速傅立叶之二(FFT、卷积的概念、常用变换)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 快速傅立叶变换(FFT)
FFT 作用:快速求两个多项式的乘积/卷积 文章目录 FFT 前置知识 复数(Complex) 单位根 离散傅立叶变换(Discrete Fourier Transform , DFT) 快速傅立叶变 ...
- 快速傅立叶变换:FFT算法原理及C++实现
傅立叶变换以高等数学(微积分)中的傅立叶级数为基础发展而来,它是信号处理(特别是图像处理)中非常重要的一种时频变换手段,具有重要应用.在图像编码.压缩.降噪.数字水印方面都有重要意义.此外,快速傅立叶 ...
- BZOJ_2194_快速傅立叶之二_(FFT+卷积)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2194 给出序列\(a[0],a[1],...,a[n-1]\)和\(b[0],b[1],... ...
- [BZOJ]2194: 快速傅立叶之二
题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...
- 【刷题】BZOJ 2194 快速傅立叶之二
Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...
最新文章
- 剑指offer 24:二叉搜索树的后序遍历序列
- [leetcode] 367. Valid Perfect Square
- (转) 设置sqlplus中的退格键
- 拓扑排序 确定比赛名次
- 前端学习(2925):vue改变样式1
- hbase 用户名密码_HBase开源 | HBase表管理系统HBaseManager2.0.2
- mysql error trace_防止DedeCMS错误警告日志data/mysql_error_trace.inc暴露后台管
- (转)机器学习入门,强烈推荐
- springcloud之ribbon负载均衡
- Java多窗口编程示例
- Matlab基础(5)——符号运算
- STM32单片机的学习方法(方法大体适用所有开发版入门)
- javaScript中内置对象Date基本操作入门
- WebRTC视频码率控制(一)—— CPU使用度检测
- 【dbeaver】发生了错误。请参阅日志文件
- Java(Spring boot)实现生成二维码
- VFS(virtual File System) 虚拟文件系统
- xctf攻防世界Leaking wp
- moodle基本安装、配置和迁移
- Invalid bound statement (not found)错误的可能原因
热门文章
- 【CyberSecurityLearning 49】PHP与MySQL进行交互
- SpringBoot中英文切换/国际化——java后端怎么用预置文本的内容替换web网页内容(Resource Bundle)
- visual c++ 部分窗口样式设置
- TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33
- ❤️你还在用visio画图吗?已经落伍啦!快来试试轻量级绘图神器draw.io吧!❤️
- Mysql:Mysql数据库系统表之详细了解INNODB_TRX、INNODB_LOCKs、INNODB_LOCK_waits、PROCESSLIST表
- pat天梯赛L1-050. 倒数第N个字符串
- java文件名特殊字符_Java 8:用名字读取特殊字符的文件
- Java-gt;Android并发编程引气入门篇
- Spring事务管理amp;数据库隔离级别