正题

题目链接:https://www.luogu.com.cn/problem/P4245


题目大意

两个多项式,求它们的乘积模ppp。


解题思路

方法好像挺多,我用的是最简单的一种就是,先定一个常数sqqsqqsqq(一般是q\sqrt qq​),把一个项的数xxx拆成k∗sqq+rk*sqq+rk∗sqq+r。然后把FFF的kkk丢进AAA,rrr丢进BBB。GGG的kkk丢进CCC,rrr丢进DDD。
然后对于A∗CA*CA∗C的部分就是sqq2sqq^2sqq2的部分,A∗D+B∗CA*D+B*CA∗D+B∗C就是sqqsqqsqq,C∗DC*DC∗D就是111。这样下来要跑777次FFT\text{FFT}FFT,很慢但是能过,而且要开long double\text{long double}long double和预处理单位根不然会被卡精度。

有一个比较快的方法是变成两个复数多项式E[x]=A[x]+B[x]∗i,F[x]=C[x]+D[x]∗iE[x]=A[x]+B[x]*i,F[x]=C[x]+D[x]*iE[x]=A[x]+B[x]∗i,F[x]=C[x]+D[x]∗i(其中iii表示−1\sqrt{-1}−1​)。然后乘起来做一下公式就可以做到333次FFT\text{FFT}FFT。

还有一个就是不会被卡精度的NTT\text{NTT}NTT方法,就是找三个有原根的模数分别跑出来,然后用CRT\text{CRT}CRT合并,这个跑的次数多,但是因为是NTT\text{NTT}NTT所以常数和第一个差不多?

时间复杂度都是O(nlog⁡n)O(n\log n)O(nlogn)就是常数有不同而已


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll N=4e5+10,sqq=32768;
const long double Pi=acos(-1);
struct complex{long double x,y;complex (long double xx=0,long double yy=0){x=xx;y=yy;return;}
}A[N],B[N],C[N],D[N];
complex operator+(complex a,complex b)
{return complex(a.x+b.x,a.y+b.y);}
complex operator-(complex a,complex b)
{return complex(a.x-b.x,a.y-b.y);}
complex operator*(complex a,complex b)
{return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
ll n,m,p,F[N],G[N],H[N],r[N];
complex w[N];
void FFT(complex *f,ll op,ll n){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1;for(ll k=0;k<n;k+=p)for(ll i=k;i<k+len;i++){complex tmp=w[n/len*(i-k)];if(op==-1)tmp.y=-tmp.y;complex tt=f[i+len]*tmp;f[i+len]=f[i]-tt;f[i]=f[i]+tt;}}if(op==-1){for(ll i=0;i<n;i++)f[i].x=(ll)(f[i].x/n+0.49);}return;
}
void MTT(ll *a,ll *b,ll *c,ll m,ll k){ll n=1;while(n<=m+k)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);for(ll len=1;len<n;len<<=1)for(ll i=0;i<len;i++)w[n/len*i]=complex(cos(i*Pi/len),sin(i*Pi/len));for(ll i=0;i<m;i++)A[i].x=a[i]/sqq,B[i].x=a[i]%sqq;for(ll i=0;i<k;i++)C[i].x=b[i]/sqq,D[i].x=b[i]%sqq;FFT(A,1,n);FFT(B,1,n);FFT(C,1,n);FFT(D,1,n);complex t1,t2;for(ll i=0;i<n;i++){t1=A[i]*C[i];t2=B[i]*D[i];B[i]=A[i]*D[i]+B[i]*C[i];A[i]=t1;C[i]=t2;}FFT(A,-1,n);FFT(B,-1,n);FFT(C,-1,n);for(ll i=0;i<n;i++){(c[i]+=(ll)(A[i].x)*sqq%p*sqq%p)%=p;(c[i]+=(ll)(B[i].x)*sqq%p)%=p;(c[i]+=(ll)(C[i].x))%=p;}return;
}
signed main()
{scanf("%lld%lld%lld",&n,&m,&p);n++;m++;for(ll i=0;i<n;i++)scanf("%lld",&F[i]);for(ll i=0;i<m;i++)scanf("%lld",&G[i]);MTT(F,G,H,n,m);for(ll i=0;i<n+m-1;i++)printf("%lld ",(H[i]%p+p)%p);
}

P4245-[模板]任意模数多项式乘法相关推荐

  1. P4245 【模板】任意模数多项式乘法

    P4245 [模板]任意模数多项式乘法 https://www.luogu.com.cn/blog/AzusaCat/solution-p4245 首先这类问题指的是对于一个非NTT模数,我们如何计算 ...

  2. P4245 【模板】任意模数多项式乘法(NTT)

    题意: P4245 [模板]任意模数多项式乘法 题解: NTT模板,记录一下 代码: #include <bits/stdc++.h>using namespace std;#define ...

  3. P4239 任意模数多项式乘法逆(多项式/ MTT)

    P4239 任意模数多项式乘法逆 这个题目简直就是毒瘤,不过还好我们可以使用vector封装要不然真的没法看,现在我们就会用vector封装MTT了,然后有一个代码细节就是这里的求逆还是在模意义下的, ...

  4. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)

    题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...

  5. 洛谷 P4245 【模板】任意模数NTT

    洛谷 P4245 [模板]任意模数NTT 贴个板子,4次DFT. Code #include<cstdio> #include<algorithm> #include<c ...

  6. 任意模数ntt_【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面右侧面板 "您想嘴谁" 中选择 &q ...

  7. 【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...

  8. 【luogu P3803】【模板】多项式乘法(NTT)

    [模板]多项式乘法(NTT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求它们的卷积. 思路 这次我们写 NTT 的做法. 它的优点就是它可以取模,而且不会有精度问题,而且会比 ...

  9. 洛谷 - P3803 【模板】多项式乘法(FFT/NTT)

    题目链接:点击查看 题目大意:给出两个多项式 F( x ) 和 G( x ) 的系数,求其卷积后的系数 题目分析:存一个FFT的模板,原理学不明白,数论和dp都扔给队友了,当个快乐的fw 代码: // ...

最新文章

  1. 送你9个快速使用Pytorch训练解决神经网络的技巧(附代码)
  2. WebStorm无法显示文件夹目录
  3. 【Android 插件化】使用 PluginKiller 帮助应用开发者规避发布的 APK 安装包被作为插件的风险 ( 验证应用是否运行在插件化引擎中 )
  4. SpringBoot_02 Spring的Java配置方式
  5. Java日志框架-Spring中使用Logback(Spring/Spring MVC)
  6. 部署在SAP ABAP服务器上的SAP UI5应用,从bsp redirect(重定向)到ui5_ui5的原因分析
  7. 2017-12-07 socket 读取问题
  8. 机器学习笔记—再谈广义线性模型
  9. LeetCode刷题(46)--Search in Rotated Array
  10. sublime text多文件夹查找关键字
  11. 直连AIX服务器,对接AIX链路问题
  12. android如何阻塞主线程,Android主线程阻塞WebView线程
  13. java大战坦克代码_坦克大战java源代码.doc
  14. 2021年PMP考试模拟题11(含答案解析)
  15. 新版火狐 拖 功能_Firefox 3:新功能,新功能和新功能
  16. 本学期课程教学要解决问题要点备忘录
  17. sys.path介绍
  18. 集训队每周一赛2020-03-13(构造+找规律+字符串+并查集)
  19. 导出 MySQL 数据库表结构设计文档
  20. 五款最优秀的java微服务框架

热门文章

  1. html的标签和标记有啥区别,HTML 元素 b 和 strong 有什么区别?//(强调标签的理解)...
  2. arcgis批量处理nc文件_气象数据处理——nc文件
  3. 实用金属材料手册_机械密封选用手册
  4. mysql数据库连接_mysql数据库连接池配置教程
  5. 关于导入c3p0-0.9.5.5.jar包引发NoClassDefFoundError、ClassNotFoundException
  6. 字符串经典题目(Leetcode题解-Python语言)
  7. libgo 支持mysql,loadrunner通过使用libmysql.dll完成mysql的测试-Go语言中文社区
  8. [SpringBoot2]自动配置
  9. Java StringBuffer 方法
  10. [数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)