多项式相关算法模板

多项式乘法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const double pi = acos(-1);
 4 const int LEN = 1e5 + 5;
 5 int n, m, N;
 6 namespace ploy {
 7     struct comp {
 8         double x, y;
 9     } a[LEN * 4], b[LEN * 4];
10     comp operator + (const comp &x,const comp &y) {
11         return (comp){x.x + y.x, x.y + y.y};
12     }
13     comp operator - (const comp &x,const comp &y) {
14         return (comp){x.x - y.x, x.y - y.y};
15     }
16     comp operator * (const comp &x,const comp &y) {
17         return (comp){x.x * y.x - x.y * y.y, x.x * y.y + x.y * y.x};
18     }
19     void FFT(comp *a, int n, int x) {
20         for (int i = n >> 1, j = 1; j < n; j++) {
21             if (i < j) swap(a[i], a[j]);
22             int k = n >> 1;
23             for (; k & i; i ^= k, k >>= 1);
24             i ^= k;
25         }
26         for (int m = 2; m <= n; m <<= 1) {
27             comp w = (comp){cos(2.0 * pi * x / m), sin(2.0 * pi * x / m)};
28             for (int i = 0; i + m <= n; i += m) {
29                 comp t = (comp){1, 0};
30                 for (int j = i; j < i + (m >> 1); j++) {
31                     comp u = a[j];
32                     comp v = t * a[j + (m >> 1)];
33                     a[j] = u + v;
34                     a[j + (m >> 1)] = u - v;
35                     t = t * w;
36                 }
37             }
38         }
39         if (x == -1) {
40             for (int i = 0; i < n; i++) a[i].x /= n;
41         }
42     }
43 }
44 using namespace ploy;
45 int main() {
46     scanf("%d %d", &n, &m);
47     n++, m++;
48     N = 1;
49     while (N < n + m - 1) N <<= 1;
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     FFT(a, N, 1);
53     FFT(b, N, 1);
54     for (int i = 0; i < N; i++) a[i] = a[i] * b[i];
55     FFT(a, N, -1);
56     for (int i = 0; i < n + m - 2; i++) printf("%d ", (int)(a[i].x + 0.5));
57     printf("%d\n", (int)(a[n + m - 2].x + 0.5));
58     return 0;
59 }

FFT

原文地址:https://www.cnblogs.com/NineSwords/p/9476698.html

时间: 2024-11-10 23:50:24

多项式相关算法模板的相关文章

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

tarjan算法模板

var {left表示点 root 没离开栈 vis表示点 root 有没有被访问过} i,n,m,now,time,color,top:longint; v:array[0..10001] of record start:longint;end; e:array[0..100001] of record y,next:longint;end; dfn,low,stack,encolor:array[0..10001] of longint; vis,left:array[0..10001] o

prim算法模板

var g:array[1..10,1..10] of longint; d:array[1..10] of longint; f:array[1..10] of boolean; procedure prim; var i,j,k,min:longint; begin fillchar(g,sizeof(g),0); fillchar(f,sizeof(f),0); for i:=1 to n do d[i]:=g[1,i]; f[1]:=true; for i:=2 to n do begi

bellman-ford算法模板

有SPFA模板,bellman-ford模板显然是多余的. var e:array[1..maxe]of record a,b,w:longint;end; { 距源点s距离 } dis:array[1..maxn]of longint; { 前驱 } pre:array[1..maxn]of longint; m,n,s:longint; procedure relax(u,v,w:longint); begin if dis[u]+w<dis[v] then begin dis[v]:=di

Floyd判最小环算法模板

算法思想:如果存在最小环,会在编号最大的点u更新最短路径前找到这个环,发现的方法是,更新最短路径前,遍历i,j点对,一定会发现某对i到j的最短路径长度dis[i][j]+mp[j][u]+mp[u][i] != INF,这时i,j是图中挨着u的两个点,因为在之前最短路更新过程中,u没有参与更新,所以dis[i][j]所表示的路径中不会出现u,如果成立,则一定是一个环.用Floyd算法来实现.但是对于负环此算法失效,因为有负环时,dis[i][j]已经不能保证i到j的路径上不会经过同一个点多次了.

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v