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 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

空间限制:256MB256MB

下载

样例数据下载

#include<cmath>
#include<cstdio>
#include<complex>
using namespace std;
typedef complex<double> E;
const double Pi=acos(-1);
const int N=3e5+10;
int n,m,L,R[N];
E a[N],b[N];
void FFT(E *a,int f){
    for(int i=0;i<n;i++) if(i<R[i]) swap(a[i],a[R[i]]);
    for(int i=1;i<n;i<<=1){
        E wn(cos(Pi/i),f*sin(Pi/i));
        for(int p=i<<1,j=0;j<n;j+=p){
            E w(1,0);
            for(int k=0;k<i;k++,w*=wn){
                E x=a[j+k],y=w*a[j+k+i];
                a[j+k]=x+y;a[j+k+i]=x-y;
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0,x;i<=n;i++) scanf("%d",&x),a[i]=x;
    for(int i=0,x;i<=m;i++) scanf("%d",&x),b[i]=x;
    for(m+=n,n=1;n<=m;n<<=1) L++;
    for(int i=0;i<n;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
    FFT(a,1);FFT(b,1);
    for(int i=0;i<=n;i++) a[i]*=b[i];
    FFT(a,-1);
    for(int i=0;i<=m;i++) printf("%d ",(int)(a[i].real()/n+0.5));
    return 0;
}
/*
比着敲完就算了,FFT理解,来日方长。
zky神犇写的非常详细
http://blog.csdn.net/iamzky/article/details/22712347
*/
时间: 2024-11-19 11:26:35

UR#34. 多项式乘法的相关文章

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 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

[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

FFT多项式乘法学习笔记

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