LibreOJ #108. 多项式乘法

二次联通门 : LibreOJ #108. 多项式乘法

/*
    LibreOJ #108. 多项式乘法

    FFT板子题
    不行啊。。。跑的还是慢

    应该找个机会学一学由乃dalao的fft
    或者是毛爷爷的fft,跑的真是快啊。。。
*/
#include <cstdio>
#include <iostream>
#include <cmath>

const int BUF = 12312312;
char Buf[BUF], *buf = Buf;

inline void read (int &now)
{
    for (now = 0; !isdigit (*buf); ++ buf);
    for (; isdigit (*buf); now = now * 10 + *buf - ‘0‘, ++ buf);
}
using std :: swap;
#define Max 3000000
typedef double flo;
struct Vec
{
    flo r, i; Vec () {}
    Vec (flo x, flo y) : r (x), i (y) {}
    Vec operator * (const Vec &b) const
    { return Vec (r * b.r - i * b.i, r * b.i + i * b.r); }
    Vec operator * (const flo &k) const
    { return Vec (r * k, i * k); }
    Vec operator + (const Vec &b) const
    { return Vec (r + b.r, i + b.i); }
    Vec operator - (const Vec &b) const
    { return Vec (r - b.r, i - b.i); }
    Vec& operator /= (const flo &k)
    { return r /= k, i /= k, *this; }
};

Vec a[Max], b[Max];
int N, M, Maxn, rader[Max];
const flo PI = acos (-1);

void FFT (Vec *a, int N, int f = 1)
{
    register int i, j, k;
    for (i = 1; i < N; ++ i)
        if (rader[i] > i) swap (a[i], a[rader[i]]);
    for (k = 1; k < N; k <<= 1)
    {
        Vec wn (cos (PI / k), f * sin (PI / k));
        for (j = 0; j < N; j += k << 1)
        {
            Vec w (1, 0), t;
            for (i = j; i < j + k; ++ i, w = w * wn)
            {
                t = w * a[i + k];
                a[i + k] = a[i] - t;
                a[i] = a[i] + t;
            }
        }
    }
    if (f == -1)
        for (i = 0; i < N; ++ i) a[i] /= N;
}

int Main ()
{
    fread (buf, 1, BUF, stdin);
    read (N), read (M); register int i; int x;
    ++ N, ++ M, Maxn = 1 << int (ceil (log2 (N + M)));
    for (i = 0; i < N; ++ i) read (x), a[i].r = x;
    for (i = 0; i < M; ++ i) read (x), b[i].r = x;

    for (i = 1; i < Maxn; ++ i)
       rader[i] = rader[i >> 1] >> 1 | (i & 1) * (Maxn >> 1);
    FFT (a, Maxn), FFT (b, Maxn);
    for (i = 0; i < Maxn; ++ i)
        a[i] = a[i] * b[i];
    N = N + M - 2;
    for (FFT (a, Maxn, -1), i = 0; i <= N; ++ i)
        printf ("%d ", int (round (a[i].r)));
    return 0;
}
int ZlycerQan = Main ();
int main (int argc, char *argv[]) {;}
时间: 2024-10-12 14:42:48

LibreOJ #108. 多项式乘法的相关文章

LOJ #108. 多项式乘法

内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题. 输入两个多项式,输出这两个多项式的乘积. 输入格式 第一行两个整数 n nn 和 m mm,分别表示两个多项式的次数. 第二行 n+1 n + 1n+1 个整数,分别表示第一个多项式的 0 00 到 n nn 次项前的系数. 第三行 m+1 m + 1m+1 个整数,分别表示第二个多项式的 0 00 到 m mm 次项前的系数.

[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

求幂运算、多项式乘法及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行操作的复杂度为

UOJ #34 多项式乘法

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

多项式乘法快速算法

多项式乘法优化算法: 设有如下两个多项式: 把它们的系数分别做成向量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

LibreOJ #100. 矩阵乘法

二次联通门 : LibreOJ #100. 矩阵乘法 /* LibreOJ #100. 矩阵乘法 矩阵乘法 注意两个矩阵宽与高相乘的顺序 */ #include <cstdio> #define Max 500 #define Mod 1000000007 int main (int argc, char *argv[]) { static long long a[Max + 1][Max + 1], b[Max + 1][Max + 1]; int N, P, M; scanf("

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)来说,其系数表示法可以看