LibreOJ #108. 多项式乘法
二次联通门 : 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[]) {;}
LibreOJ #108. 多项式乘法的更多相关文章
- loj #108. 多项式乘法
#108. 多项式乘法 题目描述 这是一道模板题. 输入两个多项式,输出这两个多项式的乘积. 输入格式 第一行两个整数 n nn 和 m mm,分别表示两个多项式的次数. 第二行 n+1 n + ...
- [UOJ#34]多项式乘法
[UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...
- [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)
卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...
- FFT模板(多项式乘法)
FFT模板(多项式乘法) 标签: FFT 扯淡 一晚上都用来捣鼓这个东西了...... 这里贴一位神犇的博客,我认为讲的比较清楚了.(刚好适合我这种复数都没学的) http://blog.csdn.n ...
- 【Uoj34】多项式乘法(NTT,FFT)
[Uoj34]多项式乘法(NTT,FFT) 题面 uoj 题解 首先多项式乘法用\(FFT\)是一个很久很久以前就写过的东西 直接贴一下代码吧.. #include<iostream> # ...
- 【learning】多项式乘法&fft
[吐槽] 以前一直觉得这个东西十分高端完全不会qwq 但是向lyy.yxq.yww.dtz等dalao们学习之后发现这个东西的代码实现其实极其简洁 于是趁着还没有忘记赶紧来写一篇博 (说起来这篇东西的 ...
- 多项式乘法(FFT)学习笔记
------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法 ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 求幂运算、多项式乘法及Horner法则的应用
一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: private static long pow(int x, int n){ if(n == 0) return 1; ...
随机推荐
- redis HyperLogLog的使用
一.概念1.redis在2.8.9版本添加了HyperLogLog结构.2.redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者体积非常非常大 ...
- VS2019删除大量空白行或者缩进大量空白行
原文:VS2019删除大量空白行或者缩进大量空白行 问题描述: 在vs编辑器的代码中有时含有大量无用的空白行,我们想删除这些大量空白行或者缩进空白行. 注: 不需要将代码复制在类似word的文本编辑器 ...
- isolate 通信
main.dart import 'package:flutter/material.dart'; import 'package:flutter_isolate/flutter_isolate.da ...
- GitHub上传文件夹
1.输入自己的用户名和邮箱 为注册GitHub账号时所用的用户名和邮箱;我的用户名为“1997ST2016”,邮箱为“1324971964@qq.com ”. $ git config --globa ...
- ConcurrentHashMap源码解析(JDK8)
首先看看CHM的重要成员变量: public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ...
- dota2从窗口模式切换到独占全屏模式后黑屏解决办法
在dota2安装目录中查找video.txt,修改setting.defaultres与setting.defaultresheight两个参数与显示器的分辨率相同. 修改setting.fullsc ...
- PM2 监控 Spring Boot 项目运行
更多 PM2 的用法介绍请参考: PM2简易使用手册 - 掘金 由于 PM2 通常都用于 node 应用, 所以 exec_mode 应写为 fork, 其中最重要的是 args, -jar 和 ja ...
- 使用protobuf (proto3, C++和go语言)
在这里,我先讲述C++使用protobuf,之后,会补充使用go语言使用protobuf. 使用protobuf需要有如下步骤: 在.proto文件中定义消息(message)格式. 使用protob ...
- Android笔记(五十二) 侧滑菜单SlidingMenu
SlidingMenu是一个优秀的开源项目,可以实现侧滑菜单,简单介绍一下这SlidingMenu的使用: 常用属性和方法: setTouchModeAbove(int i )是否可以通过滑动手势打开 ...
- Android手机测试环境搭建
Android SDK概念: SDK(software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合. ...