P4239 任意模数多项式乘法逆

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

#include<bits/stdc++.h>
#define LL long long
#define FOR(i,a,b) for(register int i=a,end##i=b;i<=end##i;++i)
#define REP(i,a,b) for(register int i=a,end##i=b;i>=end##i;--i)
#define V inline void
#define I inline LL
using namespace std;
I read()
{char x='\0';LL fh=1,sum=0;for(x=getchar();x<'0'||x>'9';x=getchar())if(x=='-')fh=-1;for(;x>='0'&&x<='9';x=getchar())sum=sum*10+x-'0';return fh*sum;
}
#define plx complex<double>
#define poly vector<plx>
const plx im(0,1);
const int N=4e5+9;
const int mod=1e9+7;
const int M=sqrt(mod);
const double pi=acos(-1);
poly a;
int n,rev[N];
plx wn[N];
V print(poly a)
{FOR(i,0,a.size()-1)cout<<a[i]<<' ';cout<<endl;//
}
I ksm(int a,int b)
{int sum=1;while(b){if(b&1)sum=1LL*sum*a%mod;b>>=1;a=1LL*a*a%mod;}return sum;
}
I inv(int x){return ksm(x,mod-2);}
V polypre(int len)
{FOR(i,0,len-1)rev[i]=(rev[i>>1]>>1)|((i&1)*(len>>1));FOR(i,0,len-1)wn[i]=plx(cos(pi/len*i),sin(pi/len*i));
}
V NTT(poly &a,int len,int tp)
{a.resize(len);FOR(i,0,len-1)if(i<rev[i])swap(a[i],a[rev[i]]);for(int mid=1;mid<len;mid<<=1){for(int i=0;i<len;i+=mid<<1){for(int j=0;j<mid;j++){plx x=a[i+j],y=a[i+mid+j]*wn[len/mid*j];a[i+j]=x+y,a[i+mid+j]=x-y;}}}if(tp==-1){FOR(i,0,len-1)a[i]/=len;reverse(&a[1],&a[len]);}
}
V MTT(poly &a,poly &b,int len)
{FOR(i,0,len-1)a[i]=a[i]+b[i]*im;NTT(a,len,1);FOR(i,0,len-1)b[i]=conj(a[i?len-i:0]);FOR(i,0,len-1){plx x=a[i],y=b[i];a[i]=0.5*(x+y);b[i]=0.5*(y-x)*im;}
}
I num(double x){return (x<0)?(LL)(x-0.5)%mod:(LL)(x+0.5)%mod;}
poly operator*(poly a,poly b)
{int n=a.size()+b.size()-1,len=1;while(len<n)len<<=1;poly a0(len),a1(len),b0(len),b1(len);a.resize(len),b.resize(len);FOR(i,0,len-1)a0[i]=(LL)a[i].real()/M,a1[i]=(LL)a[i].real()%M;FOR(i,0,len-1)b0[i]=(LL)b[i].real()/M,b1[i]=(LL)b[i].real()%M;polypre(len);//  print(a0),print(a1),print(b0),print(b1);MTT(a0,a1,len),MTT(b0,b1,len);//    print(a0),print(a1),print(b0),print(b1);
//  cout<<"polymult"<<endl;//FOR(i,0,len-1){a[i]=a0[i]*b0[i]+a1[i]*b0[i]*im;b[i]=a0[i]*b1[i]+a1[i]*b1[i]*im;}NTT(a,len,-1),NTT(b,len,-1);//   print(a),print(b);FOR(i,0,len-1){//      cout<<M<<endl;//
//      cout<<num(a[i].real())<<' '<<num(a[i].imag())<<' '<<num(b[i].real())<<' '<<num(b[i].imag())<<endl;//a[i]=(1LL*M*M*num(a[i].real())%mod+mod+1LL*M*(num(a[i].imag())+num(b[i].real()))%mod+mod+num(b[i].imag())+mod)%mod;assert(a[i].real()>=0);assert(a[i].real()<mod);
//      cout<<a[i]<<endl;//}a.resize(n);
//  print(a);return a;
}
poly operator*(int k,poly a)
{//  cout<<"mult"<<endl;//FOR(i,0,a.size()-1)a[i]=k*(LL)a[i].real()%mod;
//  cout<<"mult "<<endl;//return a;
}
poly operator+(poly a,poly b)
{if(a.size()<b.size())swap(a,b);FOR(i,0,b.size()-1)a[i]=(LL)(a[i].real()+b[i].real()+mod)%mod,assert(a[i].real()>=0);return a;
}
poly operator-(poly a){FOR(i,0,a.size()-1)a[i]=mod-a[i].real();return a;}
poly operator-(poly a,poly b){return a+(-b);}
poly polyinv(poly a)
{int n=a.size(),len=1;while(len<n*2)len<<=1;poly b={(double)inv((int)a[0].real())},c;
//  print(b);a.resize(len);for(int i=2;i<len;i<<=1){c.resize(i);FOR(j,0,i-1)c[j]=a[j];
//      cout<<i<<endl;//b=2*b-c*b*b;
//      print(b);//b.resize(i);}b.resize(n);return b;
}
int main()
{//  freopen("a.out","w",stdout);n=read();a.resize(n);FOR(i,0,n-1)a[i]=read();
//  a=a*a;
//  print(a);a=polyinv(a);FOR(i,0,n-1)printf("%d%c",(int)a[i].real(),(i==n-1)?'\n':' ');return 0;
}
/*
5
1 6 3 4 94
1 1 1 1
*/

P4239 任意模数多项式乘法逆(多项式/ MTT)相关推荐

  1. CF438E The Child and Binary Tree(有意思的生成函数 + 多项式求逆 + 多项式开方)

    整理的算法模板合集: ACM模板 点我看多项式全家桶(●^◡_◡◡​^●) CF438E The Child and Binary Tree 简单的黑题 首先我们发现模数为99824435399824 ...

  2. P6295-有标号 DAG 计数【多项式求逆,多项式ln】

    正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有nnn个点的弱联通DAGDAGDAG数量. 1≤n≤1051\leq n\leq 10^5 ...

  3. 多项式算法5:多项式求逆

    多项式算法5:多项式求逆 多项式求逆 前置知识: FFT NTT 多项式求逆 这里的多项式求逆,其实是求多项式的逆元. 对于多项式A(x)A(x)A(x),如果存在A(x)B(x)≡1(modxn)A ...

  4. 【学习笔记】超简单的多项式求逆(含全套证明)

    整理的算法模板合集: ACM模板 目录 多项式求逆 一.分治FFT 二.倍增法及其证明 三.多项式求逆例题 P4238 [模板]多项式乘法逆 点我看多项式全家桶(●^◡_◡◡​^●) 多项式求逆 一. ...

  5. 多项式求逆模板(NTT + mod)

    [模板]多项式乘法逆 /*Author : lifehappy */ #include <bits/stdc++.h>using namespace std;typedef long lo ...

  6. 多项式的各类计算(多项式的逆/开根/对数/exp/带余除法/多点求值)

    预备知识:FFT/NTT 多项式的逆 给定一个多项式 F(x)F(x)F(x),请求出一个多项式 G(x)G(x)G(x),满足 F(x)∗G(x)≡1(modxn)F(x)*G(x) \equiv ...

  7. matlab 多项式表达,MATLAB多项式

    9  多项式的表达式及其操作 9.1 多项式的表达式和创建 1.多项式的表达式 MATLAB用一个行向量来表示多项式,此行向量就是将幂指数降序排列之后多项式各项的系数.例如,考虑下面的表达式: 这就是 ...

  8. 多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合

    matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用. 多项式函数主要有: roots 求多项式的根 ...

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

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

最新文章

  1. Linux shell 学习笔记(6)— vim 编辑器使用方法及技巧
  2. 梭子鱼邮件归档设备配置
  3. 2016年6月份学习总结,读书《向着光亮那方》
  4. 化学反应工程 第一章 均相单一反应动力学和理想反应器
  5. 2017 Material design 第二章第六节《富有创造性的定制方案》
  6. 记录一下使用vue/vuex+SSR框架遇到的bug
  7. ps怎么把图片背景变透明_ps怎么添加背景?ps怎么添加背景图?
  8. 微信公众平台开发网页开发
  9. Mac系统接移动硬盘进行读写软件Mounty
  10. AUI框架的介绍和使用
  11. RN动画Animated
  12. 2022煤矿井下爆破考试题库模拟考试平台操作
  13. 爱快路由安装mysql_ESXi安装爱快iKuai OS路由(图文教程)
  14. mysql和myODBC安装和配置
  15. Android 获得联系人并排序
  16. 360无线网卡linux驱动下载,如何在Linux下写无线网卡的驱动
  17. 请保持内心中最后一点良知
  18. Win10 如何禁用BitLocker加密cmd命令
  19. html代码设置五边形,javascript怎么画正五边形?
  20. 安霸S5L通过usb虚拟网卡共享网络功能

热门文章

  1. 一个几何级数的无限和思考
  2. 地球上最快的速度......
  3. 骗人的数学题,那消失的1块钱到底被谁拿走了
  4. 女程序员怀孕7个月坚持上班敲代码
  5. Spark的基本架构
  6. json 查询 java_怎样在java中查询mysql得到如下的json格式的结果?
  7. 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序
  8. 重力模型matlab代码,STK基础教程.doc
  9. 通过python实现linux切换用户_Python操作远程服务器切换到root用户
  10. 单片微型计算机系统应用和开发特点,单片微机原理与应用(第2版)