P4239 任意模数多项式乘法逆(多项式/ MTT)
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)相关推荐
- CF438E The Child and Binary Tree(有意思的生成函数 + 多项式求逆 + 多项式开方)
整理的算法模板合集: ACM模板 点我看多项式全家桶(●^◡_◡◡^●) CF438E The Child and Binary Tree 简单的黑题 首先我们发现模数为99824435399824 ...
- P6295-有标号 DAG 计数【多项式求逆,多项式ln】
正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有nnn个点的弱联通DAGDAGDAG数量. 1≤n≤1051\leq n\leq 10^5 ...
- 多项式算法5:多项式求逆
多项式算法5:多项式求逆 多项式求逆 前置知识: FFT NTT 多项式求逆 这里的多项式求逆,其实是求多项式的逆元. 对于多项式A(x)A(x)A(x),如果存在A(x)B(x)≡1(modxn)A ...
- 【学习笔记】超简单的多项式求逆(含全套证明)
整理的算法模板合集: ACM模板 目录 多项式求逆 一.分治FFT 二.倍增法及其证明 三.多项式求逆例题 P4238 [模板]多项式乘法逆 点我看多项式全家桶(●^◡_◡◡^●) 多项式求逆 一. ...
- 多项式求逆模板(NTT + mod)
[模板]多项式乘法逆 /*Author : lifehappy */ #include <bits/stdc++.h>using namespace std;typedef long lo ...
- 多项式的各类计算(多项式的逆/开根/对数/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 ...
- matlab 多项式表达,MATLAB多项式
9 多项式的表达式及其操作 9.1 多项式的表达式和创建 1.多项式的表达式 MATLAB用一个行向量来表示多项式,此行向量就是将幂指数降序排列之后多项式各项的系数.例如,考虑下面的表达式: 这就是 ...
- 多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合
matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用. 多项式函数主要有: roots 求多项式的根 ...
- P4245 【模板】任意模数多项式乘法
P4245 [模板]任意模数多项式乘法 https://www.luogu.com.cn/blog/AzusaCat/solution-p4245 首先这类问题指的是对于一个非NTT模数,我们如何计算 ...
最新文章
- Linux shell 学习笔记(6)— vim 编辑器使用方法及技巧
- 梭子鱼邮件归档设备配置
- 2016年6月份学习总结,读书《向着光亮那方》
- 化学反应工程 第一章 均相单一反应动力学和理想反应器
- 2017 Material design 第二章第六节《富有创造性的定制方案》
- 记录一下使用vue/vuex+SSR框架遇到的bug
- ps怎么把图片背景变透明_ps怎么添加背景?ps怎么添加背景图?
- 微信公众平台开发网页开发
- Mac系统接移动硬盘进行读写软件Mounty
- AUI框架的介绍和使用
- RN动画Animated
- 2022煤矿井下爆破考试题库模拟考试平台操作
- 爱快路由安装mysql_ESXi安装爱快iKuai OS路由(图文教程)
- mysql和myODBC安装和配置
- Android 获得联系人并排序
- 360无线网卡linux驱动下载,如何在Linux下写无线网卡的驱动
- 请保持内心中最后一点良知
- Win10 如何禁用BitLocker加密cmd命令
- html代码设置五边形,javascript怎么画正五边形?
- 安霸S5L通过usb虚拟网卡共享网络功能
热门文章
- 一个几何级数的无限和思考
- 地球上最快的速度......
- 骗人的数学题,那消失的1块钱到底被谁拿走了
- 女程序员怀孕7个月坚持上班敲代码
- Spark的基本架构
- json 查询 java_怎样在java中查询mysql得到如下的json格式的结果?
- 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序
- 重力模型matlab代码,STK基础教程.doc
- 通过python实现linux切换用户_Python操作远程服务器切换到root用户
- 单片微型计算机系统应用和开发特点,单片微机原理与应用(第2版)