复数重载 与 FFT

1.复数重载:

重载了复数的运算,即重载了复数的加减乘以及赋初值。

struct Complex{          //复数的重载
double r,i;
IL Complex(){r = 0; i = 0;}
IL Complex(RG double a,RG double b){r = a; i = b;}
IL Complex operator +(Complex B){ return Complex(r+B.r,i+B.i); }
IL Complex operator -(Complex B){ return Complex(r-B.r,i-B.i); }
IL Complex operator *(Complex B){
return Complex(r*B.r-i*B.i , r*B.i+i*B.r);
}
};

其中\(f.r\)为实部 ,\(f.i\)为虚部。

2.FFT算法:

计算多项式\(f_1\)*\(f_2\) == \(f_3\)的算法,

时间复杂度\(O(n\ logn)\) , 空间最好开\(O(3n)\)到\(O(4n)\)左右;

Complex f1[_],f2[_],X,Y; int f3[_];  //f3储存卷积的系数.
const double PI = acos(-1); IL void Init(){ //读入数据,预处理.
cin >> n >> m;
for(RG int i = 0; i <= n; i ++)cin >> f1[i].r;
for(RG int j = 0; j <= m; j ++)cin >> f2[j].r; //读入两个多项式
m += n; l = 0;
for(n = 1; n <= m; n<<=1)l++;
//此时m保存卷积的长度,n等于二进制补全后 数列长度+1 .
//Rader预处理:
for(RG int i = 0; i < n; i ++)R[i] = (R[i>>1]>>1) | ((i&1)<<(l-1));
} IL void FFT(Complex *P , int opt){
for(RG int i = 0; i < n; i ++)
if(i < R[i]) swap(P[i] , P[R[i]]); //Rader 排序
for(RG int i = 1; i < n; i<<=1){
Complex W(cos(PI/i),opt*sin(PI/i));
for(RG int p = i<<1 , j = 0; j < n; j += p){
Complex w(1,0);
for(RG int k = 0; k < i; k ++,w = w*W){
X = P[j + k] , Y = w*P[j + k + i];
P[j + k] = X + Y; P[j + k + i] = X - Y;
}
}
}
if(opt == -1) for(RG int i = 0; i < n; i ++)P[i].r /= n;
} int main(){
Init(); //计算f1*f2
FFT(f1,1); FFT(f2,1);
for(RG int i = 0; i <= n; i ++)f1[i] = f1[i]*f2[i];
FFT(f1,-1); //最后结果存在f1中.
for(RG int i = 0; i <= m; i ++)f3[i] = (int)(f1[i].r+0.5));
return 0;
}

FFT && 复数重载的更多相关文章

  1. C++复数运算 重载

    近期整理下很久前写的程序,这里就把它放在博文中了,有些比较简单,但是很有学习价值. 下面就是自己很久前实现的复数重载代码,这里没有考虑特殊情况,像除法中,分母不为零情况. #include <i ...

  2. FFT算法小结

    都应该知道多项式是什么对吧(否则学什么多项式乘法) 我们用\(A(x)\)表示一个\(n-1\)次多项式,即\(A(x)=\sum_{i=0}^{n-1} {a_i}*x^i\) 例如\(A(x)=x ...

  3. 多项式相关&&生成函数相关&&一些题目(updating...)

    文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...

  4. 【C++】类-多态

    类-多态 目录 类-多态 1. 基本概念 2. 运算符重载 2.1 重载为类的成员函数 2.2 重载为非成员函数 3. 虚函数 4. 抽象类 5. override与final 1. 基本概念 多态性 ...

  5. C++复数类对除法运算符 / 的重载

    C8-1 复数加减乘除 (100.0/100.0 points) 题目描述 求两个复数的加减乘除. 输入描述 第一行两个double类型数,表示第一个复数的实部虚部 第二行两个double类型数,表示 ...

  6. C++习题 复数类--重载运算符2+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...

  7. C++习题 复数类--重载运算符+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...

  8. F2833x 调用DSP函数库实现复数的FFT的方法

    转载自:http://blog.csdn.net/aeecren/article/details/67644363:个人觉得写的很详细,值得一看 在数字信号处理中,FFT变换是经常使用到的,在DSP中 ...

  9. 15.C++-操作符重载、并实现复数类

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

随机推荐

  1. System.in实现数据的键盘输入

    System.in The "standard" input stream. This stream is already open and ready to supply inp ...

  2. Zabbix 3.2.4至3.2.7的升级方案

    1.关闭Zabbix Server 防止有新的数据提交到数据库中,也可以关闭数据库.如果更新过程中,评估告警信息可以忽略,可以先执行备份操作. 1.1.检查当前版本 /usr/local/zabbix ...

  3. Dubbo广播模式下报错:Can't assign requested address解决办法

    原因: 尝试使用Dubbo的multicast模式,发现一运行就报Can't assign requested address的错误,造成这种原因的主要是系统中开启了IPV6协议(比如window7) ...

  4. w !sudo tee %

    w !sudo tee % 该命令可用于保存有权限的写文件

  5. POJ - 1062 昂贵的聘礼 Dijkstra

    思路:构造最短路模型,抽象出来一个源点,这个源点到第i个点的费用就是price[i],然后就能抽象出图来,终点是1. 任意两个人之间都有等级限制,就枚举所有最低等级限制,然后将不再区间[min_lev ...

  6. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

  7. ARC068E - Snuke Line

    原题链接 题意简述 给出个区间和.求对于任意,有多少个区间包含的倍数. 题解 考虑怎样的区间不包含的倍数. 对于的倍数和,满足的区间不包含任何的倍数. 于是转化为二维数点问题,可以用可持久化线段树解决 ...

  8. 【BZOJ3993】 星际战争

    Time Limit: 1000 ms   Memory Limit: 128 MB Description  3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一 ...

  9. vue项目中遇到的问题

    在 export defaul new Router({ )} 这个路由配置中一定要加mode : 'history' 否者就会在路由前面默认添加# 路由跳转的几种方式: 在VUE中使用less来编译 ...

  10. Typescript 基础应用

    什么是 TypeScript TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeScri ...