题目链接:洛谷LOJ.

FFT相关:快速傅里叶变换(FFT)详解FFT总结从多项式乘法到快速傅里叶变换.

5.4 又看了一遍,这个也不错。

2019.3.7 叕看了一遍,推荐这个

  1. #include <cmath>
  2. #include <cctype>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. const int N=1e6+5;
  7. const double PI=acos(-1);
  8. int n,m;
  9. struct Complex
  10. {
  11. double x,y;
  12. Complex(double xx=0,double yy=0) {x=xx, y=yy;}
  13. Complex operator + (const Complex &a) {return Complex(x+a.x, y+a.y);}
  14. Complex operator - (const Complex &a) {return Complex(x-a.x, y-a.y);}
  15. Complex operator * (const Complex &a) {return Complex(x*a.x-y*a.y, x*a.y+y*a.x);}
  16. }A[N*3],B[N*3];//size!
  17. void Fast_Fourier_Transform(Complex *a,int lim,int opt)
  18. {
  19. for(int j=0,i=0; i<lim; ++i)
  20. {
  21. if(i>j) std::swap(a[i],a[j]);
  22. for(int l=lim>>1; (j^=l)<l; l>>=1);
  23. }
  24. for(int i=2; i<=lim; i<<=1)//最后等于lim即整个序列的合并
  25. {
  26. int mid=i>>1;
  27. Complex Wn(cos(2.0*PI/i),opt*sin(2.0*PI/i)),t;
  28. for(int j=0; j<lim; j+=i)
  29. {
  30. Complex w(1,0);
  31. for(int k=0; k<mid; ++k,w=w*Wn)
  32. a[j+mid+k]=a[j+k]-(t=w*a[j+mid+k]),
  33. a[j+k]=a[j+k]+t;
  34. }
  35. }
  36. }
  37. inline int read()
  38. {
  39. int now=0,f=1;register char c=gc();
  40. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  41. for(;isdigit(c);now=now*10+c-'0',c=gc());
  42. return now*f;
  43. }
  44. int main()
  45. {
  46. n=read(),m=read();
  47. for(int i=0; i<=n; ++i) A[i].x=(double)read();//scanf("%lf",&A[i].x);
  48. for(int i=0; i<=m; ++i) B[i].x=(double)read();//scanf("%lf",&B[i].x);
  49. int lim=1;
  50. while(lim<=n+m) lim<<=1;
  51. Fast_Fourier_Transform(A,lim,1);
  52. Fast_Fourier_Transform(B,lim,1);
  53. for(int i=0; i<=lim; ++i) A[i]=A[i]*B[i];//size!
  54. Fast_Fourier_Transform(A,lim,-1);
  55. for(int i=0; i<=n+m; ++i) printf("%d ",(int)(A[i].x/lim+0.5));
  56. return 0;
  57. }

递归实现:

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstdlib>
  5. #define gc() getchar()
  6. const int N=2e6+5;
  7. const double PI=acos(-1.0);
  8. int n,m;
  9. struct Complex
  10. {
  11. double x,y;
  12. Complex(double xx=0,double yy=0) {x=xx, y=yy;}
  13. Complex operator + (const Complex &a) {return Complex(x+a.x, y+a.y);}
  14. Complex operator - (const Complex &a) {return Complex(x-a.x, y-a.y);}
  15. Complex operator * (const Complex &a) {return Complex(x*a.x-y*a.y, x*a.y+y*a.x);}
  16. }A[N],B[N];
  17. inline int read()
  18. {
  19. int now=0,f=1;register char c=gc();
  20. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  21. for(;isdigit(c);now=now*10+c-'0',c=gc());
  22. return now*f;
  23. }
  24. void Fast_Fourier_Transform(Complex *a,int lim,int type)
  25. {
  26. if(lim==1) return;
  27. Complex a1[lim>>1],a2[lim>>1];//爆栈
  28. for(int i=0; i<lim; i+=2)
  29. a1[i>>1]=a[i], a2[i>>1]=a[i+1];
  30. Fast_Fourier_Transform(a1,lim>>1,type),
  31. Fast_Fourier_Transform(a2,lim>>1,type);
  32. Complex Wn(cos(2.0*PI/lim),type*sin(2.0*PI/lim)),w(1,0),t;//Wn:单位根 w:幂
  33. for(int i=0; i<(lim>>1); ++i,w=w*Wn)
  34. a[i]=a1[i]+(t=w*a2[i]),
  35. a[i+(lim>>1)]=a1[i]-t;
  36. }
  37. int main()
  38. {
  39. n=read(),m=read();
  40. for(int i=0; i<=n; ++i) A[i].x=read();
  41. for(int i=0; i<=m; ++i) B[i].x=read();
  42. int lim=1;
  43. while(lim<=n+m) lim<<=1;
  44. Fast_Fourier_Transform(A,lim,1);
  45. Fast_Fourier_Transform(B,lim,1);
  46. for(int i=0; i<=lim; ++i) A[i]=A[i]*B[i];
  47. Fast_Fourier_Transform(A,lim,-1);
  48. for(int i=0; i<=n+m; ++i) printf("%d ",(int)(A[i].x/lim+0.5));
  49. return 0;
  50. }

洛谷.3803.[模板]多项式乘法(FFT)的更多相关文章

  1. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  2. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  3. 洛谷.4238.[模板]多项式求逆(NTT)

    题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...

  4. P3803 [模板] 多项式乘法 (FFT)

    Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...

  5. 洛谷 P4512 [模板] 多项式除法

    题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...

  6. 洛谷 P4238 [模板] 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 多项式乘法(FFT)学习笔记

    ------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法  ...

  9. [uoj#34] [洛谷P3803] 多项式乘法(FFT)

    新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_ ...

随机推荐

  1. python之random模块分析(一)

    random是python产生伪随机数的模块,随机种子默认为系统时钟.下面分析模块中的方法: 1.random.randint(start,stop): 这是一个产生整数随机数的函数,参数start代 ...

  2. Windows下Anaconda的安装和简单使用

    Windows下Anaconda的安装和简单使用 Anaconda is a completely free Python distribution (including for commercial ...

  3. tomcat apr

    背景 前面也提过了,这次是在linux下的实验.不要信广告,要看疗效.其实起不了都大作用. 转载 开始安装~    1)安装apr     tar zxvf apr-1.4.2.tar     cd ...

  4. MySQL 数据类型(转)

    MySQL 数据类型 在 MySQL 中,有三种主要的类型:文本.数字和日期/时间类型. Text 类型: 数据类型 描述 备注 CHAR(size) 保存固定长度的字符串(可包含字母.数字以及特殊字 ...

  5. SpringMVC(4.2):Controller接口控制器详解(2)

    原文出处: 张开涛 4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4. ...

  6. 将日期或数据转换为char数据类型 TO_CHAR(x[[,c2],C3])

    TO_CHAR(x[[,c2],C3])[功能]将日期或数据转换为char数据类型[参数]x是一个date或number数据类型.c2为格式参数c3为NLS设置参数如果x为日期nlsparm=NLS_ ...

  7. C 长字符串换行方法

    C中字符串有时候会出现很长的情况,如果不换行书写查看起来很不方便. 长字符串拆分成多行处理也是C规范的一部分. 方法1. 利用双引号" " ,将长字符串分成多个子串换行,C会自动无 ...

  8. java StringTokenizer

    在java引入正则表达式和Scanner类之前分割字符串的唯一方法是使用StringTokenizer来分词,不过现在有了正则表达式和Scanner类我们可以使用更加简单更加简洁的方式来完成同样的工作 ...

  9. pytest九:使用自定义标记 mark

    pytest 可以支持自定义标记,自定义标记可以把一个 web 项目划分多个模块,然后指定模块名称执行.app 自动化的时候,如果想android 和 ios 公用一套代码时,也可以使用标记功能,标明 ...

  10. python接口自动化测试八:更新Cookies、session保持会话

    s = requests.session() # 此方法只适用于网站是cookies这种,网站是token的没用 # 这样做的好处就是可以保存cookies并保持会话,不用每次都去获取.传参 Toke ...