首页 > 其他分享 >多项式全家桶

多项式全家桶

时间:2024-05-04 12:33:37浏览次数:10  
标签:int 多项式 ll 全家 long ull Ksm Clr

还有好一些困难东西没学,现就这样吧。

每日一遍:\(167772161,469762049\)

除了求逆其他都要预留两倍空间!

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
const ll N=(1<<19)+3,H=998244353,g=3,ig=(H+1)/3;
int U[N];
ull W[N];
ll Ksm(ll x,ll y=H-2)
{
	ll s=1;
	for(ll i=1;i<=y;i<<=1,x=x*x%H)if(i&y)s=s*x%H;
	return s;
}
void Init(int L){for(int i=0;i<L;i++)U[i]=U[i/2]/2|(i&1?L/2:0);}
void Clr(ull *A,int l,int r){memset(A+l,0,(r-l+1)<<3);}
void Cpy(ull *A,ull *B,int l,int r){memcpy(A+l,B+l,(r-l+1)<<3);}
void Cro(ull *A,ull *B,int L){for(int i=0;i<L;i++)A[i]=A[i]*B[i]%H;}
void Neg(ull *A,int l,int r){for(int i=l;i<=r;i++)A[i]=!A[i]?0:H-A[i];}
void Dlt(ull *A,int L){for(int i=1;i<=L;i++)A[i-1]=A[i]*i%H;A[L]=0;}
void Sum(ull *A,int L){for(int i=L;i>0;i--)A[i]=A[i-1]*Ksm(i)%H;A[0]=0;}
void Add(ull *A,ull *B,int L){for(int i=0;i<=L;i++)A[i]=(A[i]+B[i])%H;}
void Mul(ull *A,int L,ll d){for(int i=0;i<=L;i++)A[i]=A[i]*d%H;}
void Rev(ull *A,int L){reverse(A,A+L+1);}
void NTT(ull *p,int L,int op)
{
	for(int i=0;i<L;i++)if(i<U[i])swap(p[i],p[U[i]]);
	for(int k=2,r=1;k<=L;r=k,k<<=1)
	{
		ull w=Ksm(op==1?g:ig,(H-1)/k),x;W[0]=1;
		for(int i=1;i<=r;i++)W[i]=W[i-1]*w%H;
		for(int i=0;i<L;i+=k)for(int l=i;l<i+r;l++)
			x=W[l-i]*p[l+r]%H,p[l+r]=p[l]-x+H,p[l]+=x;
		if(k==1<<16)for(int i=0;i<L;i++)p[i]%=H;
	}
	for(int i=0;i<L;i++)p[i]%=H;
	if(op==-1)for(ll i=0,j=Ksm(L);i<L;i++)p[i]=p[i]*j%H;
}
int Ceil(int n){int L=1;while(L<=n)L*=2;return L;}
void Mul(ull *A,int n,ull *B,int m)
{
	int L=Ceil(n+m);Init(L);
	NTT(A,L,1);NTT(B,L,1);
	Cro(A,B,L);NTT(A,L,-1);
}
void Inv(ull *F,int n)
{
	ull G[N],A[N],B[N];int L=Ceil(n);
	Clr(G,0,L);Clr(A,0,L);Clr(B,0,L);
	G[0]=Ksm(F[0]);
	for(int k=2,r=1;k<=L;r=k,k<<=1)
	{
		Cpy(A,G,0,r-1);Clr(A,r,k-1);Cpy(B,F,0,k-1);
		Init(k);NTT(A,k,1);NTT(B,k,1);Cro(B,A,k);NTT(B,k,-1);
		Clr(B,0,r-1);NTT(B,k,1);Cro(B,A,k);NTT(B,k,-1);
		Neg(B,r,k-1);Cpy(G,B,r,k-1);
	}
	Cpy(F,G,0,n);
}
void Ln(ull *F,int n)
{
	ull G[N];Clr(G,0,2*Ceil(n));
	Cpy(G,F,0,n);Inv(G,n);Dlt(F,n);
	Mul(F,n,G,n);Sum(F,n);
}
void Exp(ull *F,int n)
{
	ull G[N],A[N],B[N];int L=Ceil(n);
	Clr(G,0,2*L);Clr(A,0,2*L);Clr(B,0,2*L);
	G[0]=1;
	for(int k=2,r=1;k<=L;r=k,k<<=1)
	{
		Cpy(A,G,0,r-1);Clr(A,r,k-1);Cpy(B,G,0,r-1);
		Ln(A,k-1);Neg(A,0,k-1);Add(A,F,k-1);
		Mul(A,k-1,B,k-1);Cpy(G,A,r,k-1);
	}
	Cpy(F,G,0,n);
}
void Pow(ull *F,int n,ll k){Ln(F,n);Mul(F,n,k);Exp(F,n);}
void Ksm(ull *F,int n,ll k,ll _k,ll sz)
{
	ll p=0;
	while(p<=n&&!F[p])p++;
	if(p>n||p*k>n||(p&&sz>6)){Clr(F,0,n);return;}
	ll c=Ksm(F[p],_k),d=Ksm(F[p]);
	for(int i=0;i+p<=n;i++)F[i]=F[i+p]*d%H;
	Clr(F,n-p+1,n);Pow(F,n-p,k);
	for(int i=n-p*k;i>=0;i--)F[i+p*k]=F[i]*c%H;
	Clr(F,0,p*k-1);
}
void SSqrt(ull *F,int n)
{
	ull G[N],A[N],B[N];int L=Ceil(n);
	Clr(G,0,2*L);Clr(A,0,2*L);Clr(B,0,2*L);
	G[0]=1;
	for(int k=2,r=1;k<=L;r=k,k<<=1)
	{
		Cpy(A,G,0,r-1);Clr(A,r,k-1);Cpy(B,F,0,k-1);
		Inv(A,k-1);Mul(A,k-1,B,k-1);
		Mul(A,k-1,(H+1)/2);Cpy(G,A,r,k-1);
	}
	Cpy(F,G,0,n);
}
ll BSGS(ll a,ll b,ll p)
{
	ll A=1,B=sqrt(p)+1;unordered_map<ll,ll>mp;
	for(ll i=1;i<=B;i++)mp[(A=A*a%p)*b%p]=i;
	for(ll i=1,C=A;i<=B;i++,C=C*A%p)if(mp.count(C))return i*B-mp[C];
	return -1;
}
ll SqrtVal(ll x,ll k){ll y=Ksm(g,BSGS(g,x,H)/k);return min(y,H-y);}
void Sqrt(ull *F,int n)
{
	ll x=SqrtVal(F[0],2);Mul(F,n,Ksm(F[0]));
	SSqrt(F,n);Mul(F,n,x); 
}
void Div(ull *F,int n,ull *G,int m)
{
	ull A[N],B[N];int L=Ceil(n+m);
	Clr(A,0,L);Clr(B,0,L);
	Cpy(A,F,0,n);Cpy(B,G,0,m);
	Rev(A,n);Rev(B,m);Inv(B,n-m);
	if(n-m+1<=m)Clr(B,n-m+1,m);
	Mul(A,n,B,n-m);Clr(A,n-m+1,L);
	Rev(A,n-m);Cpy(B,A,0,n-m);
	Mul(A,n-m,G,m);Neg(A,0,n);Add(A,F,n);
	Clr(F,0,n);Clr(G,0,m);
	Cpy(F,B,0,n-m);Cpy(G,A,0,m-1);
}

标签:int,多项式,ll,全家,long,ull,Ksm,Clr
From: https://www.cnblogs.com/Hanghang007/p/18172174

相关文章

  • 多项式模板学习笔记
    多项式乘法存在多项式\(F(z)=\sum_{i=0}^na_iz^i,G(z)=\sum_{i=0}^mb_iz^i\),我们定义多项式乘法:\[F(z)*G(z)=\sum_i\sum_ja_ib_jz^{i+j}\]多项式的点值表达一个\(n\)次函数可以用平面上的\(n+1\)个点来表达。所以我们可以把一个\(n\)次多项式从系数表达转化成\(n+......
  • 好久没关注uCOS系统的消息了,全家桶免费后,竟一直以全新的名字Flexible Safety RTOS登场
    【视频版】https://www.bilibili.com/video/BV1Kb421Y7v9【前言】2020年初,uCOS全家桶宣布免费后,其Github上uCOS-III更新过两个小版本,uCOS-II仅更新了一次,后面就一直没有更新。uCOS-II的最后一次更新定格在2021年:uCOS-III的最后一次更新定格在2022年末  【现状】开源......
  • 多项式乘法(FFT)学习笔记
    Reference:@自为风月马前卒亦@attack的博客这里为了帮助我自己理解,先手推(抄)一遍这位dalao给出的快速傅里叶逆变换的证明。\((y_0,y_1,\dots,y_{n-1})\)为多项式\((a_0,a_1,\dots,a_{n-1})\)在\(x\)取\((\omega^0_n,\omega^1_n,\dots,\omega^{n-1}_n)\)时......
  • 普通有限多项式笔记
    普通多项式笔记\(\textrm{Newton'sMethod}\)(牛顿迭代)应用于解决已知\(g(x)\)的情况下,求出\(g(f(x))\equiv0\modx^n\)。首先通过列出方程显然,\(f(x)\modx^n\)在此时是唯一的。那么我们假设已知\(g(f_0(x))\equiv0\modx^{n/2}\),显然此时\(f_0(x)\modx^{n/2}\)也......
  • P7431【THUPC2017】小 L 的计算题 (牛顿恒等式)(分治NTT)(多项式求逆)题解
    知识点涉及:牛顿恒等式,分治\(NTT\),多项式求逆。这道题有一个推式子之后分治\(NTT+Ln+Exp\)的做法,不过也有一个不用\(Ln+Exp\)的做法(理论常数要小点,实际差不多)。题解:这道题可以牛顿恒等式直接推出一个非常好写的东西。首先看一下牛顿恒等式的描述:对于\(n\)次多项式\(A(......
  • 多项式学习笔记
    1.快速傅里叶变换(FFT)1.1.定义傅里叶变换(法语:TransformationdeFourier,英语:Fouriertransform,缩写:FT)是一种线性变换,通常定义为一种积分变换。其基本思想是一个函数可以用(可数或不可数,可数的情况对应于傅里叶级数)无穷多个周期函数的线性组合来逼近,从而这些组合系数在保有原函......
  • 多项式
    快速傅里叶变换模板题:【模板】多项式乘法(FFT)对于两个多项式\(f,g\),\(f\)的项数为\(n\),\(g\)的项数为\(m\),FFT可以\(O((n+m)\log(n+m))\)地求它们的卷积。多项式点值表示法引理:给定\(n\)个点值\(f(x_0),f(x_1),f(x_2),\dots,f(x_{n-1})\)(\(x_i\)互不相同),可确定唯一......
  • 多项式全家桶
    【多项式求逆】【整式取模】定义单项式取模。\[C\cdotx^k\bmodx^n=\begin{cases}0&k\gen\\C\cdotx^k&k<n\end{cases}\]定义多项式取模为它的每一项取模相加。可以看出,模\(x^n\)相当于保留\(0\simn-1\)次项。【问题描述】一般形式:已知多项式\(A(x),C(x)\),求\(B(x......
  • 多项式全家桶
    多项式求逆考虑倍增。若已经求出\(A\timesB'\equiv1\pmod{x^n}\),我们希望求出\(B\)使得\(A\timesB\equiv1\pmod{x^{2n}}\)。有:\[B-B'\equiv0\pmod{x^n}\]\[(B-B')^2\equiv0\pmod{x^{2n}}\]\[B^2-2BB'+B'^2\......
  • 亚马逊云集齐 Claude 3 全家桶;世界数字技术院发布大模型安全国际标准丨 RTE 开发者日
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......