求调FFT
  • 板块学术版
  • 楼主封禁用户
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/5/16 20:43
  • 上次更新2023/10/28 01:17:17
查看原帖
求调FFT
341036
封禁用户楼主2022/5/16 20:43
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL;
const int MAXN = 1e7 + 10;
const int INF = 0x3f;
const double pi  = acos(-1.0); 
//b.x -> a b.y -> b c.x ->c c.y -> d
struct num{//a + bi
	double a;//a * 1
	double b;//a * i
	num(double x = 0,double y = 0){
		a = x;
		b = y;
	}
	num cpy(){
		num an;
		an.a = a;
		an.b = b;
		return an;
	}
	num operator +(num b){
		num c = this->cpy();
		num ans;
		ans.a = (b.a + c.a);
		ans.b = (b.b + c.b);
		return ans;
	}
	num operator -(num b){
		num c = this->cpy();
		num ans;
		ans.a = (b.a - c.a);
		ans.b = (b.b - c.b);
		return ans;
	}
	num operator *(num b){
		num c = this->cpy();
		num ans;
		ans.a = (b.a * c.a - b.b * c.b);
		ans.b = (b.b * c.a + b.a * c.b);
		return ans;
	}
	num operator /(num b){
		//nothing
	}
}a[MAXN], b[MAXN];
ostream& operator << (ostream& os,const num& n)
{
	return os << n.a << " " << n.b;
}
int bin[MAXN], ans[MAXN];
double coss[MAXN], sinn[MAXN];//欧拉函数的三角函数
void FFT(int len, num *a,double type){
	for(int i = 0;i < len; i++){
		if(i < bin[i]){
			swap(a[i], a[bin[i]]);
		}
	}
	for(int j = 1;j < len; j <<= 1){
		num tmp = num(cos(pi / j), type * sin(pi / j));
		for(int k = 0;k < len; k += (j << 1)){
			num tmp1 = num(1, 0);
			for(int i = 0;i < j; i++, tmp1 = tmp1 * tmp){
				num X = a[i + k];
				num Y = tmp1 * a[i + j + k];
				a[i + k] = X + Y;
				a[i + j + k] = X - Y;
			}
		}
	}
}
int n, m;
void READ(){
	cin >> n >> m;
	for(int i = 0;i <= n; i++){
		cin >> a[i].a;
	}
	for(int i = 0;i <= m; i++){
		cin >> b[i].a;
	}
}
int len = 1;
int log_len = 0;
void SOLVE(){
	for(;len <= n + m;len <<= 1, log_len++);
	for(int i = 0;i <= len; i++){
		bin[i] = (bin[i >> 1] >> 1) | ((i & 1) << (log_len - 1));
	}
	FFT(len, a, 1);
	FFT(len, b, 1);
	for(int i = 0;i <= len; i++){
		a[i] = a[i] * b[i];
	} 
	FFT(len, a, -1);
}
void PRINT(){
	for(int i = 0;i < len; i++){
		ans[i]= a[i].a / len + 0.49;
		cout << ans[i] << " ";
	}
}
int main()
{
	READ();
	SOLVE();
	PRINT();
}
2022/5/16 20:43
加载中...