FFT快速傅里叶模板

FFT快速傅里叶模板……

/*	use way:
		assign : h(x) = f(x) * g(x)  f(x):len1  g(x):len2
		1.  len = 1;  while(len < 2 * len1 || len < 2 * len2) len <<= 1;
		2.  for i=0 to len1-1 : x1[i](f(i),0)  for i=len1 to len-1 : x1[i](0.0)   g(x) is same.....
		3.  fft(x1,len,1) fft(x2,len,1)
		4.  for i=0 to len-1 : x1[i] = x1[i] * x2[i]
		5.  fft(x1,len,-1)
		6.  ans[i] = (long long)(x[i].a + 0.5)
		ps : goback should from len1 + len2 - 1 ,but not len !  I don't know why.....
*/

#include <vector>
#include <list>
#include <map>
#include <set>
#include <stack>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>

using namespace std;

const double pi = atan(1.0) * 4;

struct complex {
	double a, b;
	complex(double aa = 0.0, double bb = 0.0) { a = aa; b = bb; }
	complex operator +(const complex &e) { return complex(a + e.a, b + e.b); }
	complex operator -(const complex &e) { return complex(a - e.a, b - e.b); }
	complex operator *(const complex &e) { return complex(a * e.a - b * e.b, a * e.b + b * e.a); }
};

void change(complex * y, long long len) {
	long long i, j, k;
	for (i = 1, j = len / 2; i < len - 1; i++) {
		if (i < j) swap(y[i], y[j]);
		k = len / 2;
		while (j >= k) {
			j -= k;
			k /= 2;
		}
		if (j < k) j += k;
	}
}

void fft(complex *y, long long len, long long on) {
	change(y, len);
	for (int h = 2; h <= len; h <<= 1) {
		complex wn(cos(-on * 2 * pi / h), sin(-on * 2 * pi / h));
		for (int j = 0; j < len; j += h) {
			complex w(1, 0);
			for (int k = j; k < j + h / 2; k++) {
				complex u = y[k];
				complex t = w * y[k + h / 2];
				y[k] = u + t;
				y[k + h / 2] = u - t;
				w = w * wn;
			}
		}
	}
	if (on == -1)
		for (int i = 0; i < len; i++)
			y[i].a /= len;
}

int main(){
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 14:02:39

FFT快速傅里叶模板的相关文章

P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 思路还是挺简单的. 输入的2个数 \(a=\overline{a_n a_{n-1} a_{n-2}\cdots a_{0}}\) , \(b=\overline{b_m b_{m-1} b_{m-2}\cdots b_{0}}\) 直接把 \(a_i\) 和 \(b_i\) 看做多项式 A 和 B 的系数,做多项式乘法即可.因为 a ,b 可以看做以 \(a_i,b_i\) 为系数,自变量为10的多项式的值,乘完后的多项式的

luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define pi acos(-1.0) inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9')c = getchar(); while(c <= '9'

[Luogu 1919]【模板】A*B Problem升级版(FFT快速傅里叶)

Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果.(注意判断前导0) Sample Input 134 Sample Output 12 HINT n<=60000 题解 A*B Problem.和 A+B Problem 一样简单. 1 input() and print(int(input()) * int(input()

luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)|FFT

题目描述 给你两个正整数 a,b,求 a×b. 输入格式 第一行一个正整数,表示 a: 第二行一个正整数,表示 b. 输出格式 输出一行一个整数表示答案. #include<cmath> #include<string> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int _=4e6+10; const double Pi=a

多项式FFT相关模板

自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <algorithm> #include <vector> using namespace std; #de

【BZOJ】【2179】FFT快速傅里叶

FFT 做的第二道用到FFT的……好吧其实还是模板题-_-b 百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=.= 1 /************************************************************** 2 Problem: 2179 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:1236 ms 7 Memory:9184 kb 8 *********************

多项式FFT/NTT模板(含乘法/逆元/log/exp/求导/积分/快速幂)

自己整理出来的模板 存在的问题: 1.多项式求逆常数过大(尤其是浮点数FFT) 2.log只支持f[0]=1的情况,exp只支持f[0]=0的情况 有待进一步修改和完善 FFT: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef double db; 5 const db pi=acos(-1); 6 const int N=4e5+10,M=1e6+10,mod=9982443

FFT&amp;NTT模板

博主菜鸡,只会背模板,根本解释不来嘤嘤嘤~ FFT: #include<bits/stdc++.h> #define IL inline #define LF double using namespace std; const int N=5e6+5; const LF Pi=acos(-1.0); struct com{ LF x,y; com(LF xx=0,LF yy=0){x=xx,y=yy;} com operator+(const com &a) const{return

FFT快速傅里叶变化

纪念人生第一次FFT 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 const int MAXN=200010; 6 class BigNum 7 { 8 public: 9 double r,i; 10 BigNum(double _r=0.0,double _i=0.0){r=_r;i=_i;} 11 BigNum operator+(const BigNum T){return BigNum