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
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

【模板】多项式乘法逆 /*Author : lifehappy */ #include <bits/stdc.h>using namespace std;typedef long long ll;const int N 1e6 10, mod 998244353, G 3;int r[N], n;ll a[N], b[N], c[N];ll quick_pow(ll a, int n) {ll ans 1;while(n) {if(n & 1) ans …

2019-02-26-算法-进化(回文数)

题目描述&#xff1a; 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 1: 输入: 121 输出: true示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为…

POJ1742 Coins(DP)

Coins 思路 没分析复杂度写了个二进制拆分&#xff0c;然后做010101背包O(nlog(c)m)>10e7了O(nlog(c)m) > 10e7了O(nlog(c)m)>10e7了&#xff0c;所以还是想办法优化吧。 我们引入一个needneedneed数组&#xff0c;need[j]need[j]need[j]表示&#xff0c;在枚举到第…

13张PPT带你了解主动式消息队列处理集群

前言偷偷和你们说&#xff0c;我搞了一份内部资料&#xff0c;该内部资料共有13张PPT&#xff0c;据作者透露&#xff0c;该PPT至少花了整整1周时间才编写完成&#xff0c;其内容简洁明了&#xff0c;内容深度足够&#xff0c;易于初学者理解&#xff0c;也给深度开发人员分享了…

CF773F Test Data Generation(倍增FFT/动态规划)

CF773F Test Data Generation https://www.luogu.com.cn/problem/CF773F 这个题还是挺巧妙的&#xff0c;最后需要我们求解的实际上值域为a选择奇数个数最大数是奇数的方案数&#xff0c;然后这个东西显然包含了3个信息&#xff0c;值域、个数、最后一个数的奇偶性&#xff0c…

2019-02-27-算法-进化(寻找两个有序数组的中位数)

题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数&#xff0c;并且要求算法的时间复杂度为 O(log(m n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 [1, 3] nums2 [2]则中位数是 2.0示例 2: nums1 [1, 2]…

.Net Core 三大Redis客户端对比和使用心得

前言稍微复杂一点的互联网项目&#xff0c;技术选型都可能会涉及Redis&#xff0c;.NetCore的生态越发完善&#xff0c;支持.NetCore的Redis客户端越来越多&#xff0c;下面三款常见的Redis客户端&#xff0c;相信大家平时或多或少用到一些&#xff0c;结合平时对三款客户端的使…

2020第十一届蓝桥杯软件类省赛第二场C/C++ 大学 B 组(题解)

试题 A: 门牌制作 问题描述 小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff0c;最后根据需要将字 符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 …

队长开卖自家产“翠香”猕猴桃

猕猴桃品种有很多&#xff0c;但不是所有的果子都叫翠香。这两天我在公众号里卖了这个翠香猕猴桃&#xff0c;可能是有同学以为是做广告卖水果&#xff0c;其实是家里的亲戚猕猴桃成熟了&#xff0c;辛苦一年下来地里一共结了3000斤猕猴桃&#xff0c;遇到了一个难题就是如何把…

Java修炼之路——基础篇——Java集合类

集合类的全景图 常用集合类特性 1. Collection&#xff1a;每个位置对应一个元素1.1: List 存放有序元素&#xff0c;允许重复元素&#xff0c;允许元素为null1.1.1: ArrayList&#xff1a;内部结构为数组&#xff1b;初始容量为10&#xff1b;插入、删除的移动速度慢&#x…

1575 Gcd and Lcm

1575 Gcd and Lcm ∑i1n∑j1i∑k1ilcm(gcd(i,j),gcd(i,k))设f(n)∑i1n∑j1nlcm(gcd(i,n),gcd(j,n))f(p)3p2−3p1f(pk)(2k1)(p2k−p2k−1)pk−1\sum_{i 1} ^{n} \sum_{j 1} ^{i} \sum_{k 1} ^{i} lcm(gcd(i, j), gcd(i, k))\\ 设f(n) \sum_{i 1} ^{n} \sum_{j 1} ^{n} lcm…

UVA12298 Super Poker II(多项式/背包问题)

UVA12298 Super Poker II 这应该是最水的背包问题了吧 然后有一个小问题就是这道题没有给模数&#xff0c;然后答案会爆int&#xff0c;所以我们需要MTT&#xff0c;然后开long long就好了&#xff0c;或者直接fft&#xff0c;有可能会爆精度。

Java修炼之路——基础篇——Java集合类详解1

SynchronizedList和Vector的区别 java.util.Vector java.util.Collections.$SynchronizedList Vector用同步方法&#xff0c;SynchronizedList用同步代码块&#xff0c;SynchronizedList可以指定锁定的对象 SynchronizedList有很好的扩展和兼容功能&#xff0c;能把所有List的子…

小卓.NET中文编程特点介绍

大家好&#xff0c;我在介绍一下我的全新编程语言&#xff0d;卓语言。小卓编程是卓语言的一个开发工具&#xff0c;可以在里面实现绘图、动画、事件响应等等功能。关于中文编程&#xff0c;一直以来都有争议。我针对以往中文编程的缺点而开发了一种全新的编程语言。首先 &…

P5748 集合划分计数(贝尔数/多项式)

P5748 集合划分计数 求解从1到1e5的所有贝尔数&#xff0c;我们可以利用生成函数求解&#xff0c;就是利用指数型生成函数求解 代码细节&#xff1a; 首先虽然exe^xex代表全是1&#xff0c;但是多项式下面还有阶乘逆元的系数&#xff0c;然后乘完之后&#xff0c;我们还有乘…

2019-02-28-算法-进化(盛最多水的容器)

题目描述 给定 n 个非负整数 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以…

CAP 2.6 版本发布通告

前言今天&#xff0c;我们很高兴宣布 CAP 发布 2.6 版本正式版。同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star.自从上次 CAP 2.5 版本发布 以来&#xff0c;已经过去了几个月的时间&#xff0c;关注的朋友可能知道&#xff0c;在这几个月的时间里&#xff0c;也…

皮克定理(题目)

Area 皮克定理&#xff1a;皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式&#xff0c;该公式可以表示为Sab2&#xff0d;1&#xff0c;其中a表示多边形内部的点数&#xff0c;b表示多边形落在格点边界上的点数&#xff0c;S表示多边形的面积。 /*Author : lifehap…

随机算法

概率论基础知识 期望的线性性 马尔可夫不等式 条件概率 独立事件 独立随机变量 随机算法 Las Vegas型随机算法 随机快速排序 随机选择 随机n皇后放置 将确定性算法的某一步修改为随机选择&#xff0c;有可能可以优化算法平均时间下的算法复杂度。 Monte Carlo型算法 主元…

求助:现在有一个可以进体制“养老”的坑,我该不该跳?

对不起&#xff0c;在当下互联网人生活的环境中&#xff0c;并没有可以“养老”的坑。对不起&#xff0c;在当下互联网人生活的环境中&#xff0c;也没有绝对”稳定“的企业。技术人的职业发展&#xff0c;以”适者生存“为核心原则&#xff0c;每一种职业环境都有相应的职业成…