[UOJ 0034] 多项式乘法

#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的模板题, 应该不用多说啥了吧OwO

FFT的讲解Rush了一晚上也没Rush出来OwO先放一波代码水一篇博(逃)

参考代码

GitHub

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <algorithm>
 7
 8 const int MAXN=270000;
 9 const int DFT=1;
10 const int IDFT=-1;
11 const double PI=acos(-1);
12
13 struct Complex{
14     double real;
15     double imag;
16     Complex(double r=0,double i=0){
17         this->real=r;
18         this->imag=i;
19     }
20 };
21 Complex operator+(Complex a,Complex b){
22     return Complex(a.real+b.real,a.imag+b.imag);
23 }
24 Complex operator-(Complex a,Complex b){
25     return Complex(a.real-b.real,a.imag-b.imag);
26 }
27 Complex operator*(Complex a,Complex b){
28     return Complex(a.real*b.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real);
29 }
30
31 Complex a[MAXN],b[MAXN],c[MAXN];
32
33 int n;             //Length of a
34 int m;             //Length of b
35 int bln=1;         //Binary Length
36 int bct;           //Bit Count
37 int len;           //Length Sum
38 int rev[MAXN];     //Binary Reverse Sort
39
40 void Initialize();
41 void FFT(Complex*,int,int);
42
43 int main(){
44     Initialize();
45     FFT(a,bln,DFT);
46     FFT(b,bln,DFT);
47     for(int i=0;i<=bln;i++){
48         c[i]=a[i]*b[i];
49     }
50     FFT(c,bln,IDFT);
51     for(int i=0;i<=len;i++){
52         printf("%d ",int(c[i].real/bln+0.5));
53     }
54     putchar(‘\n‘);
55     return 0;
56 }
57
58 void FFT(Complex* a,int len,int opt){
59     for(int i=0;i<len;i++)
60         if(i<rev[i])
61             std::swap(a[i],a[rev[i]]);
62     for(int i=1;i<len;i<<=1){
63         Complex wn=Complex(cos(PI/i),opt*sin(PI/i));
64         int step=i<<1;
65         for(int j=0;j<len;j+=step){
66             Complex w=Complex(1,0);
67             for(int k=0;k<i;k++,w=w*wn){
68                 Complex x=a[j+k];
69                 Complex y=w*a[j+k+i];
70                 a[j+k]=x+y;
71                 a[j+k+i]=x-y;
72             }
73         }
74     }
75 }
76
77 void Initialize(){
78     scanf("%d%d",&n,&m);
79     len=n+m;
80     while(bln<=len){
81         bct++;
82         bln<<=1;
83     }
84     for(int i=0;i<bln;i++){
85         rev[i]=(rev[i>>1]>>1)|((i&1)<<(bct-1));
86     }
87     for(int i=0;i<=n;i++){
88         scanf("%lf",&a[i].real);
89     }
90     for(int i=0;i<=m;i++){
91         scanf("%lf",&b[i].real);
92     }
93 }

Backup

以及日常图包OwO

时间: 2024-10-12 13:46:14

[UOJ 0034] 多项式乘法的相关文章

UOJ #34 多项式乘法

题目链接:多项式乘法 保存一发FFT与NTT板子. 学习链接:从多项式乘法到快速傅里叶变换 FFT NTT 注意差值回来的时候不取反也是可以的,只不过需要把数组\(reverse\)一下(根据单位复数根的性质应该不难理解) 代码(FFT): #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<co

●UOJ 34 多项式乘法

题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换>(毛啸). (主要用于求两个序列的卷积) 代码: 递归版: #include<bits/stdc++.h> #define MAXN 300000 using namespace std; const double Pi=acos(-1); struct Z{ double real,image;

UOJ #34 多项式乘法 FFT快速傅立叶变换

题目大意:这是一道模板题. CODE: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1000010 using namespace std; const double PI = acos(-1.0); struct Complex{ double x,y; Complex(dou

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

新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_n=\sum\limits_{i=0}^n A_iB_{n-i} \] 基本思路为先将系数表达 -> 点值表达 \(O(nlogn)\) 随后点值 \(O(n)\) 进行乘法运算 最后将点值表达 -> 系数表达 \(O(nlogn)\) 代码 #include<cstdio> #inc

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

一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 return 1; 4 if(n == 1) 5 return x; 6 if(n % 2 == 0) 7 return pow(x * x, n / 2); 8 else 9 return pow(x * x, n / 2) * x; 10 } 分析: 每次递归,使得问题的规模减半.2到6行操作的复杂度为

多项式乘法快速算法

多项式乘法优化算法: 设有如下两个多项式: 把它们的系数分别做成向量X=[x0,x1,x2,x3,......]的形式,得 F=[2,3,1] G=[5,2,0] 那么根据卷积公式 可以求得向量F和G的卷积S=[10,19,11,2] 而由多项式乘法可算出 各项系数和上面的卷积结果正好一一对应. 所以说,多项式相乘,相当于系数向量的卷积. 再仔细观察一下这个多项式:每个系数正好对应的就是频域 Reference: http://www.cnblogs.com/bigcat/archive/200

poj 3046 Ant Counting 多项式乘法解可重组合数

题意: 裸的求可重组合数. 分析: 多项式乘法求系数的应用啊,不用dp. 代码: //poj 3046 //sep9 #include <iostream> using namespace std; const int maxN=1024; const int maxL=100024; const int mod=1000000; int num[maxN]; int coef[maxL]; int tmp[maxL]; int l1; void mul(int l2) { for(int i

UR#34. 多项式乘法

#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

FFT多项式乘法学习笔记

??其实我不知道我是否真的理解了FFT,但是我会用FFT优化多项式乘法了QAQ.. (以下大多摘自算导 前置知识 1. 多项式 ??在一个代数域F上,关于变量x的多项式定义为形式和形式表示的函数 A(x)=∑j=0n?1ajxj,其中a0-an?1为多项式各项的系数 2. 多项式的次数界 ??若多项式有非零系数的最高次项为xk,则称k为该多项式的次数,任何严格大于k的整数都是这个多项式的次数界. 3. 多项式的表示 (1)系数表示法 ??对于一个次数界为n的多项式A(x)来说,其系数表示法可以看