当前位置: 首页 > news >正文

【题解】LC:卷积(Convolution)(NTT)

板题。

考虑到数据范围是 10^6,又是大整数计算。

可以使用 NTT。 没学过指路:【FFT & NTT | 那忘算 7】快速傅里叶变换 & 快速数论变换 (洛谷 P3803 题解)_傅里叶 洛谷-CSDN博客


卡 fft 椰树神了喵。

#include <bits/stdc++.h> using namespace std; typedef long long LL; const int M = 3e6 + 10; //这里得开大点,2e6 不够 const LL P = 998244353; LL qpow(LL a, LL b) { LL res = 1; a %= P; while (b) { if (b & 1) { res = res * a %P; } a = a * a %P; b /= 2; } return res; } LL a[M], b[M], r[M]; int limit, l; void NTT(LL *A, LL type) { //type:原根的特定幂次(正变换用原根,逆变换用原根的逆元) for (int i = 0; i < limit; i++) if(i < r[i]){ swap(A[i], A[r[i]]); } for (int mid = 1; mid < limit; mid <<= 1) { //mid 是当前半长 // 计算当前长度 2 * mid 对应的单位根:x ^ {limit / (2 * mid)} // 为什么是 limit / (2 * mid)?就相当于原来的 g^{(P - 1) / limit} 上面的幂次 *当前长度 /limit //就等于 g^{(P - 1) / 当前长度} LL Wn = qpow( type, limit / (2 * mid) ); // R是当前子问题的完整长度,j表示当前处理到哪个位置 for(int R = mid << 1, j = 0; j < limit; j += R) { LL w = 1; // 初始化当前单位根为 1(即 w_n^0) for(int k = 0; k < mid; k++, w = w * Wn %P) { // 蝴蝶操作 LL x = A[j + k]; LL y = w * A[j + mid + k] %P; A[j + k] = (x + y)%P; A[j + mid + k] = (x - y + P)%P; //这里一定要 + P!!不然会输出负数!! } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n; cin >> m; for (int i = 0; i < n; i++) { cin >> a[i]; } for(int i = 0; i < m; i++) { cin >> b[i]; } limit = 1; l = 0; while (limit <= n + m) { limit <<= 1; l++; } LL invl = qpow(limit, P - 2); //计算 N在模 P下的逆元 for (int i = 0; i < limit; i++) { // 计算二进制位逆序 r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)); } //(P-1)/N 是N次单位根 LL t = qpow(3ll, (P - 1) / limit); // 执行 NTT正变换 NTT(a, t); NTT(b, t); for (int i = 0; i <= limit; i++) { a[i] = a[i] * b[i] % P; } // 计算原根的逆元(用于逆变换) LL inv_t = qpow(t, P - 2); // 执行 NTT逆变换 NTT(a, inv_t); for (int i = 0; i <= n - 1 + m - 1; i++) { cout << a[i] * invl % P << " "; // 逆变换后需要除以 limit(乘以 limit的逆元) } cout << "\n"; return 0; }
http://www.jsqmd.com/news/1321041/

相关文章:

  • SAP SD客户状态管理:从核心原理到实战配置的完整指南
  • RE-UE4SS终极指南:三步掌握虚幻引擎游戏修改神器
  • 给园区上一套AR导览系统大概要多少钱
  • 大脑缺少“成功数据”。
  • 精选天津深耕多年本土回收老店 统一对标大盘金价无任何隐形花销 - 日常比对手册
  • Windows系统界面深度优化:ExplorerPatcher技术实现与架构解析
  • 视频转换文字工具推荐:2026高精准度免费方案,短视频提取字幕无水印,电脑手机全指南
  • 深入解析Cache地址映像:直接相联、全相联与组相联的设计权衡
  • 终极指南:如何用Wand-Enhancer免费解锁专业版功能
  • GetQzonehistory:开启你的QQ空间数字记忆时光之旅
  • ParaView处理PLOT3D格式文件的常见问题与解决方案
  • 阿里云ECS密钥对连接与安全管理实战指南
  • 抖音爆款内容自动分发机器人是如何炼成的?——扣子平台API深度调用与合规风控全拆解(2024最新版)
  • 2026大连LV二手包包回收指南:闲置变现,为什么大连人都选易奢福? - 肉松卷
  • Vue.js中v-bind与v-model的核心区别与应用场景
  • 3分钟部署GitHub加速插件:国内开发者必备的浏览器扩展解决方案
  • 视频转文字软件有哪些?2026免费付费推荐,支持普通话方言英文提取字幕
  • Lumafly终极指南:跨平台空洞骑士模组管理解决方案
  • 3个关键设置让魔兽争霸3重获新生:告别卡顿与黑边的终极优化指南
  • 成都锦江黄金回收|今日回收多少钱一克,报价怎么查 - 融媒生活
  • 20260802-03-案例分享-数字孪生赋能新型工业化2026三大标杆案例深度复盘
  • 告别 yfinance 频繁封 IP!基于 QuantDash 高性能 SDK 零成本搭建稳定美股量化数据管道
  • 2026郑州高端西服定制行业实测——恰特迪伦西服定制综合实力解析 - 新闻快传
  • AI视频号冷启动突围战(2024最新算法适配版):抖音/微信双平台流量分发机制逆向拆解
  • ABAP SQL字符串处理:CONCAT、SUBSTRING、CAST与LPAD实战指南
  • IL2CPP游戏Mod开发:解决BepInEx加载UnityExplorer的兼容性问题
  • 微信生态AI矩阵实战白皮书(含GPT-4o+扣子+飞书多维表格落地配置表·限内部流出)
  • PCB批量组装配套参数批量校准
  • R语言:从数据科学入门到实战应用
  • 电力行业开源输电作业平台架构与实现解析