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

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

快速傅里叶变换(FFT)

#include <bits/stdc++.h>
using namespace std;
const int N=4e6; //2^22=4194304
const double PI=acos(-1.0);
typedef complex<double> Complex;
double A[N], B[N], C[N]; // FFT加速卷积,输入:a[0..na], b[0..nb],输出:c[0..na+nb]
void Mul(double *a, double *b, double *c, int na, int nb) {int len = 1;while (len < na + nb - 1) len <<= 1;   // 补齐到 2 的幂static Complex A[1 << 22], B[1 << 22]; // 注意:临时数组大小需根据实际最大len调整for (int i = 0; i < na; i++) A[i] = Complex(a[i], 0);fill(A + na, A + len, Complex(0, 0));for (int i = 0; i < nb; i++) B[i] = Complex(b[i], 0);fill(B + nb, B + len, Complex(0, 0));vector<int> rev(len); // 位逆序置换数组for (int i = 0; i < len; i++)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) ? (len >> 1) : 0);auto fft = [&](Complex *a, int type) { // FFT 变换(type=1 为正变换,-1 为逆变换)for (int i = 0; i < len; i++)if (i < rev[i]) swap(a[i], a[rev[i]]);for (int mid = 1; mid < len; mid <<= 1) {Complex wn(cos(PI / mid), type * sin(PI / mid)); // 单位根for (int i = 0; i < len; i += (mid << 1)) {Complex w(1, 0);for (int j = 0; j < mid; j++) {Complex x = a[i + j], y = w * a[i + j + mid];a[i + j] = x + y;a[i + j + mid] = x - y;w *= wn;}}}if (type == -1) {for (int i = 0; i < len; i++) a[i] /= len;}};fft(A, 1); fft(B, 1);for (int i = 0; i < len; i++) A[i] *= B[i];fft(A, -1);for (int i = 0; i < na + nb - 1; i++) c[i] = A[i].real(); // 取实部
}
int main() {int n, m;  scanf("%d%d", &n, &m);for(int i=0; i <= n; i++) scanf("%lf", &A[i]);for(int i=0; i <= m; i++) scanf("%lf", &B[i]);Mul(A, B, C, n+1, m+1);for(int i=0; i <= n+m; i++) printf("%d ", (int)(C[i] + 0.5));return 0;
}

快速数论变换(NTT)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e6;
const int P=998244353;
int A[N], B[N], C[N];
int qpow(int a, int b) {int ans=1;for(; b; a=a*a%P, b>>=1)if(b&1) ans=ans*a%P;return ans;
}
// NTT加速 输入:a[0..na], b[0..nb] 输出:c[0..na+nb]
void Mul(int *a, int *b, int *c, int na, int nb) {int len=1;while(len < na+nb-1) len<<=1;   // 补齐到 2 的幂static int A[N], B[N]; // 临时数组copy(a, a+na, A); fill(A+na, A+len, 0);copy(b, b+nb, B); fill(B+nb, B+len, 0);vector<int> rev(len); // 位逆序置换数组for (int i=0; i < len; i++)rev[i]=(rev[i>>1]>>1)|((i&1) ? (len>>1) : 0);auto ntt=[&](int *a, int type) {//NTT lambda捕获rev和lenfor(int i=0; i < len; i++)if(i < rev[i]) swap(a[i], a[rev[i]]);for(int mid=1; mid < len; mid <<= 1) {int wn=qpow(3, (P-1)/(mid<<1));   //原根取3 if(type == -1) wn=qpow(wn, P-2); //逆变换用逆元for(int i=0; i < len; i+=(mid<<1)) {int w=1;for(int j=0; j < mid; j++) {int x=a[i+j], y=w*a[i+j+mid]%P;a[i+j]=(x+y)%P;a[i+j+mid]=(x-y+P)%P;w=w*wn%P;}}}if(type == -1) {int inv_len=qpow(len, P-2);for(int i=0; i < len; i++) a[i]=a[i]*inv_len%P;}};ntt(A, 1); ntt(B, 1);for(int i=0; i < len; i++) A[i]=A[i]*B[i]%P;ntt(A, -1);for(int i=0; i < na+nb-1; i++) c[i]=A[i];
}signed main() {int n, m;cin >> n >> m;for(int i=0; i <= n; i++) cin >> A[i];for(int i=0; i <= m; i++) cin >> B[i];Mul(A, B, C, n+1, m+1);for(int i=0; i <= n+m; i++) cout << C[i] << ' ';return 0;
}
http://www.jsqmd.com/news/546366/

相关文章:

  • 宇树机器狗go2仿真避坑指南:如何用Velodyne VLP-16雷达降低电脑负载(附完整配置流程)
  • Phi-4-Reasoning-Vision基础教程:双卡4090环境安装、镜像拉取与端口映射
  • 请解释什么是 Docker Swarm,并描述其主要功能。
  • StructBERT情感模型快速部署:镜像免配置+毫秒响应实测分享
  • 用STC89C52RC单片机+L298N驱动模块,做个可调直流电源(附PWM控制代码)
  • 别再让液冷板成为瓶颈:结构热设计规范+仿真技术要点全在这
  • LVGL 7.11.0 Chart控件实战:5分钟搞定动态心率折线图(附完整代码)
  • 智能微电网中利用粒子群算法实现多目标优化 有完整数据可运行 :智能微电网中对多目标问题的优化...
  • 三步掌握Dark Reader:从入门到精通的护眼浏览解决方案
  • 告别电脑噪音:用开源风扇控制工具打造个性化散热方案
  • 如何用PWM精准控制45步进电机速度?从0.5KHz到8KHz实战解析
  • OriginCar传感器数据可视化实战:FoxGlove从安装到ROS通信的全流程配置
  • 避坑指南:Go语言decimal库四舍五入的3种姿势对比(含银行家舍入场景)
  • 不止于提取:用ArcMap 10.0水文工具链,为你的SWAT/HEC-HMS模型准备完美流域输入数据
  • 用LDA模型挖掘微信聊天秘密:Gensim实战教程(含pyLDAvis可视化)
  • VESC项目必备!用Makerbase Davega模块打造你的电动车仪表盘(支持GPS/里程记录)
  • DREAMER数据集实战:基于EEG与ECG的多模态情绪识别技术解析
  • UniPush 2.0推送实战:从云函数到App,如何优雅处理Android/iOS通知权限引导?
  • 从PWM调光到编码器测速:手把手玩转STM32F103的定时器外设
  • 钢丝编织橡胶护套连接器有多少种类?
  • YOLOv8目标检测新玩法:用VMamba替换C2f模块,我在DDSM医疗数据集上mAP涨到了0.724
  • ACS71020霍尔电能计量芯片驱动开发与精度校准指南
  • 技术深度解析:PDFMathTranslate如何通过ONNX推理引擎实现毫秒级文档解析与极速排版保留
  • Python自动化获取LabelStudio标注数据的3种实用方法(附完整代码)
  • 【技术解析】ELAN:如何通过分组多尺度自注意力与共享机制重塑轻量级超分网络
  • 项目分享|Deep-Live-Cam:开源AI视频深度伪造工具
  • 人肉暗网计划:用脑电波传输反抗代码
  • StructBERT情感分析在人力资源领域的应用
  • Role: Your_Role_Name
  • 项目分享|MemOS:AI智能体的记忆操作系统,赋能长效个性化交互