这是一道模板题。

给你两个多项式,请输出乘起来后的多项式。

输入格式

第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数。

第二行 \(n+1\) 个整数,表示第一个多项式的 \(0\) 到 \(n\) 次项系数。

第三行 \(m+1\) 个整数,表示第二个多项式的 \(0\) 到 \(m\) 次项系数。

输出格式

一行 \(n+m+1\) 个整数,表示乘起来后的多项式的 \(0\) 到 \(n+m\) 次项系数。

样例一

input

1 2

1 2

1 2 1

output

1 4 5 2

explanation

\((1 + 2x) \cdot (1 + 2x + x^2) = 1 + 4x + 5x^2 + 2x^3\)

限制与约定

\(0 \leq n, m \leq 10^5\),保证输入中的系数大于等于 \(0\) 且小于等于 \(9\) 。

时间限制:1s

空间限制:256MB

题解

迟来的FFT,用的迭代版,更快一些

Menci的博客写得很好

  1. #include<bits/stdc++.h>
  2. #define ui unsigned int
  3. #define ll long long
  4. #define db double
  5. #define ld long double
  6. #define ull unsigned long long
  7. const int MAXN=1<<21;
  8. const db Pi=acos(-1.0);
  9. int n1,n2,n,m,rev[MAXN],cnt;
  10. struct Complex{
  11. db real,imag;
  12. inline Complex operator + (const Complex &A){
  13. return (Complex){real+A.real,imag+A.imag};
  14. };
  15. inline Complex operator - (const Complex &A){
  16. return (Complex){real-A.real,imag-A.imag};
  17. };
  18. inline Complex operator * (const Complex &A){
  19. return (Complex){real*A.real-imag*A.imag,imag*A.real+real*A.imag};
  20. };
  21. };
  22. Complex a[MAXN],b[MAXN];
  23. template<typename T> inline void read(T &x)
  24. {
  25. T data=0,w=1;
  26. char ch=0;
  27. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  28. if(ch=='-')w=-1,ch=getchar();
  29. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  30. x=data*w;
  31. }
  32. template<typename T> inline void write(T x,char ch='\0')
  33. {
  34. if(x<0)putchar('-'),x=-x;
  35. if(x>9)write(x/10);
  36. putchar(x%10+'0');
  37. if(ch!='\0')putchar(ch);
  38. }
  39. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  40. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  41. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  42. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  43. inline void FFT(Complex *A,int tp)
  44. {
  45. for(register int i=0;i<n;++i)
  46. if(i<rev[i])std::swap(A[i],A[rev[i]]);
  47. for(register int l=2;l<=n;l<<=1)
  48. {
  49. Complex wn=(Complex){cos(2*Pi/l),sin(tp*2*Pi/l)};
  50. for(register int i=0;i<n;i+=l)
  51. {
  52. Complex w=(Complex){1,0};
  53. for(register int j=0;j<(l>>1);++j)
  54. {
  55. Complex A1=A[i+j],A2=A[i+j+(l>>1)]*w;
  56. A[i+j]=A1+A2;A[i+j+(l>>1)]=A1-A2;
  57. w=w*wn;
  58. }
  59. }
  60. }
  61. }
  62. int main()
  63. {
  64. read(n1);read(n2);
  65. n1++;n2++;m=n1+n2-1;
  66. for(register int i=0;i<n1;++i)scanf("%lf",&a[i].real);
  67. for(register int i=0;i<n2;++i)scanf("%lf",&b[i].real);
  68. for(n=1;n<m;n<<=1)++cnt;
  69. for(register int i=0;i<n;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(cnt-1));
  70. FFT(a,1);FFT(b,1);
  71. for(register int i=0;i<=n;++i)a[i]=a[i]*b[i];
  72. FFT(a,-1);
  73. for(register int i=0;i<m;++i)write((int)(a[i].real/n+0.5),' ');
  74. puts("");
  75. return 0;
  76. }

【刷题】UOJ #34 多项式乘法的更多相关文章

  1. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  2. UOJ 34: 多项式乘法(FFT模板题)

    关于FFT 这个博客的讲解超级棒 http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transfor ...

  3. ●UOJ 34 多项式乘法

    题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换> ...

  4. UOJ#34. 多项式乘法(NTT)

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

  5. UOJ 34 多项式乘法 FFT 模板

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

  6. 2018.11.14 uoj#34. 多项式乘法(fft)

    传送门 NOIpNOIpNOIp爆炸不能阻止我搞oioioi的决心 信息技术课进行一点康复训练. fftfftfft板题. 代码: #include<bits/stdc++.h> usin ...

  7. 2018.11.14 uoj#34. 多项式乘法(ntt)

    传送门 今天学习nttnttntt. 其实递归方法和fftfftfft是完全相同的. 只不过fftfftfft的单位根用的是复数中的东西,而nttnttntt用的是数论里面有相同性质的原根. 代码: ...

  8. UOJ 34 多项式乘法 ——NTT

    [题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...

  9. [UOJ 0034] 多项式乘法

    #34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...

随机推荐

  1. Java:String、StringBuffer、StringBuilder

    一.String 1. String类是final类,意味着String类不能被继承,它的成员方法都默认为final方法.在早期的JVM版本中,被final修饰的方法会转为内嵌调用来提升执行效率.从J ...

  2. 【JUC源码解析】Exchanger

    简介 Exchanger,并发工具类,用于线程间的数据交换. 使用 两个线程,两个缓冲区,一个线程往一个缓冲区里面填数据,另一个线程从另一个缓冲区里面取数据.当填数据的线程将缓冲区填满时,或者取数据的 ...

  3. JAVA日志框架概述

            日志用来记录应用的运行状态以及一些关键业务信息,其重要性不言而喻,通常我们借助于现有的日志框架完成日志输出.目前开源的日志框架很多,常见的有log4j.logback等,有时候我们还会 ...

  4. 使用advanced_installer将.net web程序打包为安装程序

    当项目开发完成之后,需要给客户使用时,总不能将发布后的文件全部放一起压缩后直接给客户吧,然后客户需要自行搭建环境修改配置等等,体验太差了,这时候我们就需要使用一种打包工具了,查了一些资料之后,我选择使 ...

  5. 应用UserDefaults储存游戏分数和最高分

    应用UserDefaults储存游戏分数和最高分 我们在GameScene.swift里 private var currentScore:SKLabelNode! // 当前分数节点 private ...

  6. Unity 编辑器扩展

    自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...

  7. 【isJson( jsonObj )】判断是否是JSON实例

    判断是否是JSON实例: 原型:isJson( jsonObj ) 说明:判断对象是否是JSON实例 返回:[true | false] 示例: <% Set jsonObj1 = toJson ...

  8. 小程序开发中,纯css实现内容收起折叠功能

    不多说,直接上代码: wxml页面: <!--收起折叠 begin--> <view style='width:100%;background:#fff;border-top:1px ...

  9. iscroll手册

    概述: 大家在日常工作中最常用的插件是什么,jQurey?Lazyload?但是这些都是在PC端,但是在移动端最常用的插件莫过于iScroll了,iScroll到底是什么东西,应该怎么用?iScrol ...

  10. vue移动音乐app开发学习(二):页面骨架的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...