#34. 多项式乘法

这是一道模板题。

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

输入格式

第一行两个整数 nn 和 mm,分别表示两个多项式的次数。

第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项系数。

第三行 m+1m+1 个整数,表示第二个多项式的 00 到 mm 次项系数。

输出格式

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

样例一

input

1 2
1 2
1 2 1

output

1 4 5 2

explanation

(1+2x)⋅(1+2x+x2)=1+4x+5x2+2x3(1+2x)⋅(1+2x+x2)=1+4x+5x2+2x3。

限制与约定

0≤n,m≤1050≤n,m≤105,保证输入中的系数大于等于 00 且小于等于 99。

时间限制:1s1s

空间限制:256MB

分析

FFT/NTT模板题。

code

递归:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6
 7 using namespace std;
 8 const int N = 300100;
 9 const double eps = 1e-8;
10 const double pi = acos(-1.0);
11 typedef long long LL;
12
13 struct Complex {
14     double x,y;
15     Complex() {x=0,y=0;}
16     Complex(double xx,double yy) {x=xx,y=yy;}
17
18 }A[N],B[N];
19
20 Complex operator + (Complex a,Complex b) {
21     return Complex(a.x+b.x,a.y+b.y);
22 }
23 Complex operator - (Complex a,Complex b) {
24     return Complex(a.x-b.x,a.y-b.y);
25 }
26 Complex operator * (Complex a,Complex b) {
27     return Complex(a.x*b.x-a.y*b.y,a.x*b.y+b.x*a.y);
28 }
29
30 void FFT(Complex *a,int n,int ty) {
31     if (n==1) return ;
32     Complex a1[n>>1],a2[n>>1];
33     for (int i=0; i<=n; i+=2) {
34         a1[i>>1] = a[i],a2[i>>1] = a[i+1];
35     }
36     FFT(a1,n>>1,ty);
37     FFT(a2,n>>1,ty);
38     Complex w1 = Complex(cos(2.0*pi/n),ty*sin(2.0*pi/n));
39     Complex w = Complex(1.0,0.0);
40     for (int i=0; i<(n>>1); i++) {
41         Complex t = w * a2[i];
42         a[i+(n>>1)] = a1[i] - t;
43         a[i] = a1[i] + t;
44         w = w * w1;
45     }
46 }
47 int main() {
48     int n,m;
49     scanf("%d%d",&n,&m);
50     for (int i=0; i<=n; ++i) scanf("%lf",&A[i].x);
51     for (int i=0; i<=m; ++i) scanf("%lf",&B[i].x);
52     int fn = 1;
53     while (fn <= n+m) fn <<= 1;
54     FFT(A,fn,1);
55     FFT(B,fn,1);
56     for (int i=0; i<=fn; ++i)
57         A[i] = A[i] * B[i];
58     FFT(A,fn,-1);
59     for (int i=0; i<=n+m; ++i)
60         printf("%d ",(int)(A[i].x/fn+0.5));
61     return 0;
62 }

View Code

非递归

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6
 7 using namespace std;
 8 const int N = 300100;
 9 const double eps = 1e-8;
10 const double Pi = acos(-1.0);
11 typedef long long LL;
12
13 struct Complex {
14     double x,y;
15     Complex() {x=0,y=0;}
16     Complex(double xx,double yy) {x=xx,y=yy;}
17
18 }A[N],B[N];
19
20 Complex operator + (Complex a,Complex b) {
21     return Complex(a.x+b.x,a.y+b.y);
22 }
23 Complex operator - (Complex a,Complex b) {
24     return Complex(a.x-b.x,a.y-b.y);
25 }
26 Complex operator * (Complex a,Complex b) {
27     return Complex(a.x*b.x-a.y*b.y,a.x*b.y+b.x*a.y);
28 }
29 void FFT(Complex *a,int n,int ty) {
30     // 按递归时最底层的顺序翻转
31     for (int i=0,j=0; i<n; ++i) {
32         if (i < j) swap(a[i],a[j]);
33         for (int k=n>>1; (j^=k)<k; k>>=1);
34     }
35     // 当前正在求次数界为m的多项式。m=1的已经在上面求出来了,所以现在在求次数界为2的多项式。
36     for (int m=2; m<=n; m<<=1) {
37         Complex w1 = Complex(cos(2*Pi/m),ty*sin(2*Pi/m));
38         for (int i=0; i<n; i+=m) { // 当前求的多项式下标为[i,i+m-1]
39             Complex w = Complex(1,0);
40             for (int k=0; k<(m>>1); ++k) { // 由[i,i+(m/2)-1]和[i+(m/2),i+m-1] 求出[i,i+m-1]的多项式
41                 Complex t = w * a[i+k+(m>>1)];
42                 Complex u = a[i+k];
43                 a[i+k] = u + t;
44                 a[i+k+(m>>1)] = u - t;
45                 w = w * w1;
46             }
47         }
48     }
49 }
50 int main() {
51     int n,m;
52     scanf("%d%d",&n,&m);
53     for (int i=0; i<=n; ++i) scanf("%lf",&A[i].x);
54     for (int i=0; i<=m; ++i) scanf("%lf",&B[i].x);
55     int fn = 1;
56     while (fn <= n+m) fn <<= 1;
57     FFT(A,fn,1);
58     FFT(B,fn,1);
59     for (int i=0; i<=fn; ++i)
60         A[i] = A[i] * B[i];
61     FFT(A,fn,-1);
62     for (int i=0; i<=n+m; ++i)
63         printf("%d ",(int)(A[i].x/fn+0.5));
64     return 0;
65 }

View Code

NTT

注意代码中的longlong,取模。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6
 7 using namespace std;
 8
 9 typedef long long LL;
10 const int N = 300100;
11 const int P = 998244353;
12 int A[N],B[N];
13
14 int ksm(int a,int b) {
15     int ans = 1;
16     while (b) {
17         if (b & 1) ans = (1ll * ans * a) % P;
18         a = (1ll * a * a) % P;
19         b >>= 1;
20     }
21     return ans % P;
22 }
23 void NTT(int *a,int n,int ty) {
24     // 按递归时最底层的顺序翻转
25     for (int i=0,j=0; i<n; ++i) {
26         if (i < j) swap(a[i],a[j]);
27         for (int k=n>>1; (j^=k)<k; k>>=1);
28     }
29     // 当前正在求次数界为m的多项式。m=1的已经在上面求出来了,所以现在在求次数界为2的多项式。
30     for (int m=2; m<=n; m<<=1) {
31         int w1 = ksm(3,(P-1)/m);
32         if (ty == -1) w1 = ksm(w1,P-2);
33         for (int i=0; i<n; i+=m) { // 当前求的多项式下标为[i,i+m-1]
34             int w = 1;
35             for (int k=0; k<(m>>1); ++k) { // 由[i,i+(m/2)-1]和[i+(m/2),i+m-1] 求出[i,i+m-1]的多项式
36                 int t = 1ll * w * a[i+k+(m>>1)] % P;
37                 int u = a[i+k];
38                 a[i+k] = (u + t) % P;
39                 a[i+k+(m>>1)] = (u - t + P) % P;
40                 w = 1ll * w * w1 % P;
41             }
42         }
43     }
44 }
45 int main() {
46     int n,m;
47     scanf("%d%d",&n,&m);
48     for (int i=0; i<=n; ++i) scanf("%d",&A[i]),A[i] = (A[i] + P) % P;
49     for (int i=0; i<=m; ++i) scanf("%d",&B[i]),B[i] = (B[i] + P) % P;
50     int len = 1;
51     while (len <= n+m) len <<= 1;
52     NTT(A,len,1);
53     NTT(B,len,1);
54     for (int i=0; i<len; ++i) A[i] = 1ll * A[i] * B[i] % P;
55     NTT(A,len,-1);
56     int inv = ksm(len,P-2);
57     for (int i=0; i<len; ++i) A[i] = 1ll * A[i] * inv % P;
58     for (int i=0; i<=n+m; ++i) printf("%d\n",A[i]);
59     return 0;
60 }

View Code

转载于:https://www.cnblogs.com/mjtcn/p/8454231.html

UOJ #34. 多项式乘法相关推荐

  1. UOJ #34 多项式乘法

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

  2. 【UOJ】【34】多项式乘法

    快速傅里叶变换模板题 算法理解请看<算法导论>第30章<多项式与快速傅里叶变换>,至于证明插值唯一性什么的看不懂也没关系啦-只要明白这个过程是怎么算的就ok. 递归版:(425 ...

  3. 解题报告(二)多项式问题(多项式乘法及其各种运算)(ACM/ OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  4. 【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )

    文章目录 一.Matlab 卷积和多项式乘法 conv 函数 二.使用 matlab 代码求卷积并绘图 一.Matlab 卷积和多项式乘法 conv 函数 Matlab 文档地址 : https:// ...

  5. 求幂运算、多项式乘法及Horner法则的应用

    一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 retu ...

  6. PAT甲级1009 Product of Polynomials:[C++题解]多项式乘法、高精度乘法

    文章目录 题目分析 题目链接 题目分析 多项用一个数组来表示,数组下标表示多项式的次幂,存的内容表示多项式的系数. 然后用两重循环来计算多项式的乘法: for i : 第二个式子for j:第一个式子 ...

  7. 洛谷 - P3803 【模板】多项式乘法(FFT/NTT)

    题目链接:点击查看 题目大意:给出两个多项式 F( x ) 和 G( x ) 的系数,求其卷积后的系数 题目分析:存一个FFT的模板,原理学不明白,数论和dp都扔给队友了,当个快乐的fw 代码: // ...

  8. P4239 任意模数多项式乘法逆(多项式/ MTT)

    P4239 任意模数多项式乘法逆 这个题目简直就是毒瘤,不过还好我们可以使用vector封装要不然真的没法看,现在我们就会用vector封装MTT了,然后有一个代码细节就是这里的求逆还是在模意义下的, ...

  9. P4245 【模板】任意模数多项式乘法

    P4245 [模板]任意模数多项式乘法 https://www.luogu.com.cn/blog/AzusaCat/solution-p4245 首先这类问题指的是对于一个非NTT模数,我们如何计算 ...

最新文章

  1. OpenCV 3最新模块介绍
  2. 德华安顾人寿签约神策数据,精耕数字化加速保险服务质效升级
  3. 计算机屏幕偏白,电脑屏幕显示泛白怎么修正
  4. 点击button自动提交表单原因及解决方案
  5. mysql5.6 排序失效_mysql 使用union(all) + order by 导致排序失效
  6. HALCON 21.11:深度学习笔记---有监督训练(6)
  7. 使用MEAT在iOS设备上采集取证信息
  8. 2020华为软挑热身赛
  9. MES系统的功能详细以及应用价值介绍
  10. java.lang.NoClassDefFoundError: org/jaxen/JaxenException
  11. 三角网导线平差实例_附合导线平差教程
  12. 【转载】DIY新浪微博Android手机客户端(一)(二)(三)完
  13. 数据分析之数据分类了解
  14. 智课雅思词汇---九、mon是什么意思
  15. win7适合oracle哪个版本下载,win7系统下载--Windows 7下成功安装ORACLE客户端
  16. Excel表格中如何快速插入多个空白行
  17. qt 串口助手 界面美化
  18. python unicode编码转换中文_python实现unicode转中文及转换默认编码的方法
  19. 开/闭环控制的直流调速系统
  20. Python+Selenium 实现新理念外语网络教学平台 自动答英语听力 -- 山东科技大学

热门文章

  1. C++编程积累——C++实现十进制与二进制之间的互相转换
  2. 带你自学Python系列(九):一文读懂Python中字典应用原理!
  3. 实例说明代码段(.text)、数据段(.data)、bss段、只读数据段(.rodata)、堆栈的划分依据
  4. CornerNet: 将目标检测问题视作关键点检测与配对
  5. 这就是数据分析之算法认知
  6. php把时间戳改为时间格式,php怎么把时间格式转换为时间戳?
  7. 牛顿插值实验报告C语言,牛顿插值C语言.doc
  8. go web db每次关闭_竟然不用写代码!一款可视化 Web 管理后台生成工具
  9. 2016版系统集成项目管理工程师考试题型举例
  10. Windows Server 2008 R2 安全加固