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

/*
LibreOJ #108. 多项式乘法 FFT板子题
不行啊。。。跑的还是慢 应该找个机会学一学由乃dalao的fft
或者是毛爷爷的fft,跑的真是快啊。。。
*/
#include <cstdio>
#include <iostream>
#include <cmath> const int BUF = ;
char Buf[BUF], *buf = Buf; inline void read (int &now)
{
for (now = ; !isdigit (*buf); ++ buf);
for (; isdigit (*buf); now = now * + *buf - '', ++ 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 (-); void FFT (Vec *a, int N, int f = )
{
register int i, j, k;
for (i = ; i < N; ++ i)
if (rader[i] > i) swap (a[i], a[rader[i]]);
for (k = ; k < N; k <<= )
{
Vec wn (cos (PI / k), f * sin (PI / k));
for (j = ; j < N; j += k << )
{
Vec w (, ), 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 == -)
for (i = ; i < N; ++ i) a[i] /= N;
} int Main ()
{
fread (buf, , BUF, stdin);
read (N), read (M); register int i; int x;
++ N, ++ M, Maxn = << int (ceil (log2 (N + M)));
for (i = ; i < N; ++ i) read (x), a[i].r = x;
for (i = ; i < M; ++ i) read (x), b[i].r = x; for (i = ; i < Maxn; ++ i)
rader[i] = rader[i >> ] >> | (i & ) * (Maxn >> );
FFT (a, Maxn), FFT (b, Maxn);
for (i = ; i < Maxn; ++ i)
a[i] = a[i] * b[i];
N = N + M - ;
for (FFT (a, Maxn, -), i = ; i <= N; ++ i)
printf ("%d ", int (round (a[i].r)));
return ;
}
int ZlycerQan = Main ();
int main (int argc, char *argv[]) {;}

最新文章

  1. 用iptables 实现本地端口转发
  2. arcgis flexviewer中由Application向widget传值
  3. [教程] 以本论坛为例,手把手教你使用按键精灵POST登陆网页
  4. onblur判断数字
  5. socket网络编程的一些基础知识
  6. The mell hall——坑爹
  7. Ubuntu通过使用PyCharm 执行调试 Odoo 8.0 可能的问题
  8. &lt;script&gt;标签中的 defer 与 async区别
  9. SpringCloud学习之sleuth&amp;zipkin
  10. gprinter佳博打印机androidSDK
  11. 洛谷P1228 分治
  12. LOJ558 我们的 CPU 遭到攻击 LCT
  13. SPI、I2C、UART三种串行总线协议的区别
  14. scrapy爬虫的编写步骤
  15. Ubuntu几种常见乱码解决方法
  16. Python 之 filecmp
  17. 构建之法——Team &amp; Scrum &amp; MSF
  18. ZOJ2748 Free Kick 2017-04-18 20:40 40人阅读 评论(0) 收藏
  19. 树莓派gitlab
  20. 【BZOJ2395】[Balkan 2011]Timeismoney

热门文章

  1. .NET母版实例2(UI页面)
  2. 使用springboot实现一个简单的restful crud——02、dao层单元测试,测试从数据库取数据
  3. console.log()、console.info()、console.debug()的区别
  4. vue使用vuex大体结构
  5. JavaScript_01-script
  6. iOS 作为蓝牙外设广播信息
  7. iptables-1基本知识和工作原理
  8. nginx 是如何分配 worker 进程连接数的
  9. linux系统编程面试题
  10. mysqldump简单备份