UOJ#34 FFT模板题
写完上一道题才意识到自己没有在博客里丢过FFT的模板……
这道题就是裸的多项式乘法,可以FFT,可以NTT,也可以用Karasuba(好像有人这么写没有T),也可以各种其他分治乘法乱搞……
所以我就直接给板子了
#include <cstdio>
#include <cmath>
#define MAXN 300005
#define DB double
#define pi 3.14159265358
struct cp {
DB x, y;
cp(){} cp(DB a, DB b):x(a), y(b){}
cp operator + (const cp &r) const { return cp(x+r.x, y+r.y); }
cp operator - (const cp &r) const { return cp(x-r.x, y-r.y); }
cp operator * (const cp &r) const { return cp(x*r.x - y*r.y, x*r.y+y*r.x); }
} a[MAXN], b[MAXN], tmp;
inline void Swap(cp &a, cp &b) { tmp=a; a=b; b=tmp; }
int n, m;
inline void fft(cp *a, int f) {
for(int i = 0, j = 0; i < n; ++ i) {
if(i > j) Swap(a[i], a[j]);
for(int l = (n>>1); (j^=l) < l; l >>= 1);
}
for(int i = 1; i < n; i <<= 1) {
cp wn(cos(pi/i), f*sin(pi/i));
for(int j = 0; j < n; j += i<<1) {
cp w(1, 0);
for(int k = 0; k < i; ++ k, w = w * wn) {
cp x = a[j + k], y = w * a[j + k + i];
a[j + k] = x + y;
a[j + k + i] = x - y;
}
}
}
if(-1 == f) for(int i = 0; i < n; ++ i) a[i].x /= n;
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 0; i <= n; ++ i) scanf("%lf", &a[i].x);
for(int i = 0; i <= m; ++ i) scanf("%lf", &b[i].x);
for(m = n+m, n = 1; n <= m; n <<= 1);
fft(a, 1); fft(b, 1);
for(int i = 0; i <= n; ++ i) a[i] = a[i] * b[i];
fft(a, -1);
for(int i = 0; i <= m; ++ i) printf("%d ", (int)(a[i].x+0.1));
}
UOJ#34 FFT模板题的更多相关文章
- HDU 1402 A * B Problem Plus (FFT模板题)
FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...
- 51nod 1028 大数乘法 V2 【FFT模板题】
题目链接 模板题.. #include<bits/stdc++.h> using namespace std; typedef int LL; typedef double db; nam ...
- UOJ 34: 多项式乘法(FFT模板题)
关于FFT 这个博客的讲解超级棒 http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transfor ...
- HDU 1402 fft 模板题
题目就是求一个大数的乘法 这里数字的位数有50000的长度,按平时的乘法方式计算,每一位相乘是要n^2的复杂度的,这肯定不行 我们可以将每一位分解后作为系数,如153 = 1*x^2 + 5*x^1 ...
- [hdu1402]A * B Problem Plus(FFT模板题)
解题关键:快速傅里叶变换fft练习. 关于结果多项式长度的确定,首先将短多项式扩展为长多项式,然后扩展为两倍. #include<cstdio> #include<cstring&g ...
- [UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]
后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> ...
- UOJ 34 多项式乘法 FFT 模板
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...
- UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题
http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using nam ...
- 【刷题】UOJ #34 多项式乘法
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...
随机推荐
- datastage小结
1.当使用datastage组建 look_up时,得注意sparse功能,当primary link过来的数据关联不到时,传过来的值并不是null,而是空串.... 解决方法,可在transfer里 ...
- text()和html()的区别,以及val()
text():设置或返回所选元素的文本内容: html():设置或返回所选元素的内容(包括 HTML 标记): val():设置或返回表单字段的值 例如: <!DOCTYPE html>& ...
- Redis在windows下安装和PHP中使用
1.redis简介redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...
- 四、解决MyEclipse控制台输出中文乱码的问题
问题描述: 在Java程序中,在MyEclipse开发环境下,通过标准输入输入中文,并把输入的中文信息从标准输出显示出来,这时中文出现乱码情况.解决方法:解决方法需要两个步骤(本文测试环境 ...
- git 创建远程分支和删除 master 分支
. . . . . 最近需要将不同的客户的代码分开管理,所以需要为这些代码分别创建分支. 目前版本库中分支结构如下: [yuhuashi@local:Project]$ git branch -a* ...
- 学习 OPenGL
今天在网上看到一篇硕士论文<基于OpenGL三维虚拟场景建模技术研究_王志杰>,学习到OpenGL可以进行三维重建,决定从现在开始学习OpenGL,特开此贴.
- Sum All Primes
function sumPrimes(num) { //return num; var arr = []; var ifPrime = function(num){ if(num < 2){ r ...
- Error:Protocol family unavailable
在环境变量添加:_JAVA_OPTIONS 变量值为:-Djava.net.preferIPv4Stack=true 环境变量添加方法链接: http://jingyan.baidu.com/arti ...
- iava多线程详解(2)-成员变量与局部变量访问
有两段代码 1.线程访问成员变量 public class FirstThreadTest { public static void main(String[] args) { FirstThread ...
- Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
{ "Author": "tomcat and jerry", "url":"http://www.cnblogs.com/tom ...