洛谷 P3803 【模板】多项式乘法(FFT)

【模板】多项式乘法(FFT)

题目背景

这是一道多项式乘法模板题。

注意:本题并不属于中国计算机学会划定的提高组知识点考察范围。

题目描述

给定一个 n n n 次多项式 F ( x ) F(x) F(x),和一个 m m m 次多项式 G ( x ) G(x) G(x)

请求出 F ( x ) F(x) F(x) G ( x ) G(x) G(x) 的卷积。

输入格式

第一行两个整数 n , m n,m n,m

接下来一行 n + 1 n+1 n+1 个数字,从低到高表示 F ( x ) F(x) F(x) 的系数。

接下来一行 m + 1 m+1 m+1 个数字,从低到高表示 G ( x ) G(x) G(x) 的系数。

输出格式

一行 n + m + 1 n+m+1 n+m+1 个数字,从低到高表示 F ( x ) ⋅ G ( x ) F(x) \cdot G(x) F(x)G(x) 的系数。

样例 #1

样例输入 #1

1 2
1 2
1 2 1

样例输出 #1

1 4 5 2

提示

保证输入中的系数大于等于 0 0 0 且小于等于 9 9 9

对于 100 % 100\% 100% 的数据: 1 ≤ n , m ≤ 10 6 1 \le n, m \leq {10}^6 1n,m106

原题

洛谷P3803——传送门

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;// NTT的特殊要求:模数P需满足P=k*2^m+1,例如常用的模数998244353=7*17*2^23+1
const int Mod = 998244353;
const int G = 3; // 998244353的原根为3
const int maxn = 1e6 + 6;int QuickPow(int a, int k) // 快速幂
{int ret = 1;while (k){if (k & 1)ret = 1LL * ret * a % Mod;a = 1LL * a * a % Mod;k >>= 1;}return ret;
}int rev[3 * maxn];
inline void GetReverse(int len, int lg) // 获得二进制位的反转
{for (int i = 0; i < len; i++)rev[i] = 0;for (int i = 0; i < len; i++)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg - 1));
}void NTT(vector<int> &a, int dir)
{int len = a.size();for (int i = 0; i < len; i++)if (i < rev[i])swap(a[i], a[rev[i]]);int g = (dir == 1 ? G : QuickPow(G, Mod - 2));for (int stp = 1; stp < len; stp <<= 1){int wn = QuickPow(g, (Mod - 1) / (stp << 1));int w = 1;for (int k = 0; k < stp; k++){for (int even = k; even < len; even += stp << 1){int odd = even + stp;int tmp = 1LL * w * a[odd] % Mod;a[odd] = (a[even] - tmp + Mod) % Mod;a[even] = (ll)(a[even] + tmp) % Mod;}w = 1LL * w * wn % Mod;}}if (dir == -1){int inv = QuickPow(len, Mod - 2); // 乘法逆元for (int i = 0; i < len; i++)a[i] = 1LL * a[i] * inv % Mod;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 以下代码实现了多项式f(x)和多项式g(x)相乘int n, m;cin >> n >> m;int lg = 0;int bound = 1; // 将多项式的系数扩充到2的整数次幂while (bound <= n + m){bound <<= 1;lg++;}GetReverse(bound, lg);vector<int> f(bound, 0), g(bound, 0); // 数组大小开到bound(即结果多项式扩充后的大小)for (int i = 0; i <= n; i++){cin >> f[i];}for (int i = 0; i <= m; i++){cin >> g[i];}NTT(f, 1);NTT(g, 1);for (int i = 0; i < bound; i++){f[i] = (1LL * f[i] * g[i]) % Mod; // 将相乘结果存储在f[]数组中}NTT(f, -1);for (int i = 0; i <= n + m; i++){cout << f[i] << ' ';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言--指针数组和数组指针的区别

指针数组 就是一个数组&#xff0c;由指针构成的数组&#xff0c;每一个元素都是指针&#xff0c;每个指针可以指向不同的内存地址&#xff0c;这些地址可以是数组、变量。 int var1 10; int var2 20; int var3 30;int *ptrArray[3]; // 定义一个指针数组&#xff0c;包含…

2024年上半年软件系统架构师论文【回忆版】

文章目录 考试时间考试地点案例分析1、微服务架构的优点和缺点2、质量属性的6个元素3、分布式锁 Redis的缺点4、MongoDB 存储矢量图的优势 论文回忆版论文一、论单元测试的设计与应用论文二、论大数据模型的设计与应用论文三、论模型驱动的架构设计及应用论文四、论云原生运维的…

Mybatis-Plus-Join

1. 简介 官网 https://mybatisplusjoin.com/ 2. 基本用法 步骤&#xff1a; 添加依赖 <!--mybatis-plus-join--> <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><ve…

探索LangGraph:如何创建一个既智能又可控的航空客服AI

这种设计既保持了用户控制权&#xff0c;又确保了对话流程的顺畅。但随着工具数量的增加&#xff0c;单一的图结构可能会变得过于复杂。我们将在下一节中解决这个问题。 第三部分的图将类似于下面的示意图&#xff1a; 状态定义 首先&#xff0c;定义图的状态。我们的状态和L…

homography原理和图像相似度计算

1. homography 讲homography原理 讲homography应用 2. 图像相似度计算 20230621-计算两幅图像的相似度 20221205-有史以来最全的图像相似度算法 20231112-图像相似度对比方法

C++:List的使用和模拟实现

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers …

golang+redis的延时队列

网址 https://github.com/cfanbo/delay-queue-redis 代码结构很简单&#xff0c;简单代表着自由度很高&#xff0c;使用过程中出现问题也很好修改。 我很喜欢这样的代码&#xff0c;至少我看的懂&#xff0c;该有的都有。 //package main // //import ( // "context&q…

leetcode209_长度最小的子数组

要求某个连续的区间内的元素值总和>S . 思路&#xff1a;滑动窗口&#xff1a;本质上是一种双指针法。 &#xff08;1&#xff09;初始化left right 0&#xff1b; &#xff08;2&#xff09;left不动&#xff0c;right移动&#xff0c;扩大窗口&#xff0c;直至符合要…

selinux的安全策略可以影响ntp的方式

SELinux 是一个灵活而强大的模块化安全策略框架&#xff0c;它允许管理员定义和执行非常具体的访问控制策略。这些策略可以限制程序和进程对系统资源的访问&#xff0c;包括文件、网络端口、进程间通信等。 对于NTP&#xff0c;SELinux 策略可以影响以下几个方面&#xff1a; …

网络空间安全数学基础·整除与同余

主要内容&#xff1a; 整除的基本概念&#xff08;掌握&#xff09; 素数&#xff08;掌握&#xff09; 同余的概念&#xff08;掌握&#xff09; 1.1整除 定义&#xff1a;设a&#xff0c;b是任意两个整数&#xff0c;其中b≠0&#xff0c;如果存在一个整数q&#xff0c;使 …

12306技术内幕

公司内部做的一次技术分享 文章目录 12306的成就12306系统特点12306系统难点解决思路产品角度技术角度余票库存的表如何设计&#xff1f; 抢票软件推荐巨人的肩膀 对于未公开的技术部分&#xff0c;只能结合已公开的信息&#xff0c;去做大胆的猜想。 本文提到的一些解决方案&…

SpringBoot + Mybatis-Plus中乐观锁实现

悲观锁 悲观锁是一种悲观思想&#xff0c;它认为数据很可能会被别人所修改 所以总会对数据进行上锁&#xff0c;读操作和写操作都会上锁&#xff0c;性能较低&#xff0c;使用较少&#xff01; 乐观锁 乐观锁是一种乐观思想&#xff0c;它认为数据并不一定会被别人所修改 所以…

成为程序员后我都明白了什么?从入行到弃坑?

作为一个入行近10年的php程序员&#xff0c;真心感觉一切都才刚开始&#xff0c;对计算机&#xff0c;编程语言的理解也好&#xff0c;程序员中年危机也罢&#xff0c;之前都是听别人说的&#xff0c;真的自己到了这个水平&#xff0c;这个年龄才深刻体会到这其中的种种。 我一…

测试基础05:软件测试的分类

课程大纲 1、两种架构&#xff08;Architecture&#xff09; 1.1、B/S&#xff08;Browser/Server&#xff09; 浏览器服务器架构&#xff08;大体3步&#xff09;&#xff1a;用户通过浏览器向服务器发出请求&#xff0c;服务器处理请求&#xff0c;将结果通过网络返回到用户…

使用Webcam实现摄像头的开启和关闭,并保存和复制图片

实现思路 0&#xff0c;将webcam的jar文件传入项目中 1&#xff0c;显示摄像头的地方&#xff1a;创建一个画板&#xff0c;在画板上添加开启和关闭按钮 2&#xff0c;设置开启和关闭功能&#xff1a;创建一个类实现动作监听器&#xff0c;进而实现监听动作按钮 3&#xff…

【数据结构与算法篇】二叉树链式结构及实现

【数据结构与算法篇】二叉树链式结构及实现 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 4. 二叉树链式结构的实现 4.1 前置说明 4.2 二叉树的遍历 4.2.1 前序、中序以及…

通过ssh在本地打开远程服务器的网页

用途 在远程服务器使用jupyter notebook或者tensorboard等时&#xff0c;在本地打开服务器端的网页的方式有很多比如可以使用MobaXterm工具等&#xff0c;此方法可参考https://blog.csdn.net/cc__cc__/article/details/108060618?spm1001.2014.3001.5502。 若直接使用ssh则可…

C++感受11-Hello Object 成员版

当一个C程序员在设计类型时&#xff0c;他在想什么&#xff1f; 这一类型的对象&#xff0c;需要拥有哪些属性数据&#xff1f;这一类型的对象&#xff0c;它将拥有哪些功能&#xff1f;这一类型的对象&#xff0c;它的各个属性和功能之间&#xff0c;有哪些关联关系&#xff1…

OceanBase的存储架构与传统LSM-Tree架构的异同|OceanBase数据转储合并技术解读(二)

前篇博文将OceanBase的存储架构巧妙地与自然界中的“水生态”进行了类比&#xff0c;今日我们转变视角&#xff0c;聚焦在与拥有相同LSM-Tree架构的其他产品的比较&#xff0c;深入探讨OceanBase相较于它们所展现出的独特性能。 众所周知&#xff0c;OceanBase数据库的存储引擎…