洛谷 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.pswp.cn/web/15327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15327.shtml
英文地址,請注明出處:http://en.pswp.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數據庫的存儲引擎…