多项式的操作大赏

该文章已整合到多项式全家桶,模板封装,并且修改了很多错误,笔芯~


写在前面

         \ \ \ \ \ \ \,       今年WC,t1就考了多项式呢,是laofu出的,当然了我这么才并没有做出来,骗了36分就跑路了。

         \ \ \ \ \ \ \,       不过还是看出来是考的多项式了,记得laofu在讲课的时候,前半场还知道怎么操作,后面就完全不知道了。

         \ \ \ \ \ \ \,       比如说exp啊,不仅不会还不知道是什么东西呢。

在这里插入图片描述

         \ \ \ \ \ \ \,       因为以前考的多项式比较少,就没怎么注意去学,就学了求逆和卷积这种简单的。于是后来就找时间学了一下感觉比较重要的操作。就以洛咕板子为目录,在此记录一下。感觉多项式还是挺好理解的,就是要用很多所学知识,还有临时变量名没有清干净的话会特别麻烦。
在这里插入图片描述
         \ \ \ \ \ \ \,       那就这样开始吧,我会贴上一部分我丑陋的代码。


  • 乘法(卷积)

         \ \ \ \ \ \ \,       这个东西嘛,说实话吧,没有那么好理解,但是却很基础很重要,算是一个大前提吧,具体一点的我写在了这里【求多项式卷积的变换】

         \ \ \ \ \ \ \,       那么这里就贴一下板子,下面的模板会用到的这个样子,因为很多时候都会用到逆元,所以说多项式的题,NTT见得多:

const int mod=998244353,mod_g=3;
int R[N];
int power(int a,int b){
  	int ans=1;
  	for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
  	return ans;
}
#define Inv(x) power(x,mod-2)
int Polynomial_init(int n){
	int len;for(len=1;len<=n;len<<=1);
	return len;
}
void NTT(int *a,int f,int la){
	int n=la;
   	for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
   	for(int i=1;i<n;i<<=1){
    	int gn=power(mod_g,(mod-1)/(i<<1));
    	for(int j=0;j<n;j+=(i<<1)){
      		int g=1;
      		for(int k=0;k<i;k++,g=1ll*g*gn%mod){
        		int x=a[j+k],y=1ll*g*a[i+j+k]%mod;
        		a[j+k]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;
      		}
    	} 
  	}
  	if(f==-1){
   		reverse(a+1,a+n);
    	int inv=Inv(n);
    	for(int i=0;i<n;i++)a[i]=1ll*a[i]*inv%mod;
  	}
}

       &ThinSpace; \ \ \ \ \ \ \,       然后会用下面两种方式用到卷积:

       &ThinSpace; \ \ \ \ \ \ \,        C o n v o l u t i o n Convolution Convolution函数是把 a a a b b b两个多项式一起卷到 a a a里,会破坏 a a a b b b原来的形态。

int Convolution(int *a,int *b,int la,int lb){
	int n=la,m=lb;
	int L=0;for(m+=n,n=1;n<=m;n<<=1)L++;
	for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
	NTT(a,1,n);NTT(b,1,n);
	for(int i=0;i<=n;i++)a[i]=1ll*a[i]*b[i]%mod;
	NTT(a,-1,n);
	return m;
}

       &ThinSpace; \ \ \ \ \ \ \,        M u l t i p l i c a t i o n Multiplication Multiplication函数是把 a a a b b b两个多项式一起另外卷到 c c c里,不会破坏 a a a b b b原来的形态。

int X[N],Y[N];
void Multiplication(int *a,int *b,int *c,int la,int lb){
  	int n=la,m=lb;
  	int L=0;for(m+=n,n=1;n<=m;n<<=1)L++;
  	for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
	for(int i=0;i<=la;++i) X[i]=a[i];
	for(int i=0;i<=lb;++i) Y[i]=b[i];
  	NTT(X,1,n);NTT(Y,1,n);
  	for(int i=0;i<=n;i++)c[i]=1ll*X[i]*Y[i]%mod,X[i]=Y[i]=0;
  	NTT(c,-1,n);
}

  • 求逆

       &ThinSpace; \ \ \ \ \ \ \,       求一个多项式 A A A 的模 x n x^n xn 的逆元 B B B 时,假设先求出了模 x n 2 x^{\frac{n}{2}} x2n 的逆元 B 2 B_2 B2,既:

A ∗ B 2 ≡ 1   ( m o d   x n 2 ) A*B_2 \equiv 1\ (mod\ x^{\frac{n}{2}}) AB21 (mod x2n)

A ∗ B ≡ 1   ( m o d   x n ) A*B \equiv 1\ (mod\ x^{n}) AB1 (mod xn)

       &ThinSpace; \ \ \ \ \ \ \,       那么显然存在:

A ∗ B ≡ 1   ( m o d   x n 2 ) = A ∗ B 2 A*B \equiv 1\ (mod\ x^{\frac{n}{2}})=A*B_2 AB1 (mod x2n)=AB2

B − B 2 ≡ 0   ( m o d   x n 2 ) B-B_2 \equiv 0\ (mod\ x^{\frac{n}{2}}) BB20 (mod x2n)

       &ThinSpace; \ \ \ \ \ \ \,       两边同时平方:

B 2 − 2 B B 2 + B 2 2 ≡ 0   ( m o d   x n ) B^2-2BB_2+B_2^2 \equiv 0\ (mod\ x^n) B22BB2+B220 (mod xn)

       &ThinSpace; \ \ \ \ \ \ \,       再把 A A A 乘回去:

( A ∗ B ) ∗ B − ( A ∗ B ) ∗ 2 B 2 + A ∗ B 2 2 ≡ A ∗ 0   ( m o d   x n ) (A*B)*B-(A*B)*2B_2+A*B_2^2 \equiv A*0\ (mod\ x^n) (AB)B(AB)2B2+AB22A0 (mod xn)

B − 2 B 2 + A ∗ B 2 ≡ 0   ( m o d   x n ) B-2B_2+A*B^2 \equiv 0\ (mod\ x^n) B2B2+AB20 (mod xn)

B ≡ 2 B 2 − A ∗ B 2 2   ( m o d   x n ) B \equiv 2B_2-A*B_2^2\ (mod\ x^n) B2B2AB22 (mod xn)

       &ThinSpace; \ \ \ \ \ \ \,       我们就可以递归来处理他了,边界是 B 0 ≡ A 0 − 1 ( m o d   x 1 ) B_0 \equiv A_0^{-1}(mod\ x^1) B0A01(mod x1)

       &ThinSpace; \ \ \ \ \ \ \,       这里代码是把 a a a 求逆到 b b b,不会破坏 a a a 原来的形态,其中的 l e n len len a a a 的长度在二进制下向上取的整数:

int C[N];
void Inverse(int *a,int *b,int len){
  	if(len==1){b[0]=Inv(a[0]);return;}
  	Inverse(a,b,(len+1)>>1);
  	int L=0,n=1;
  	for(;n<(len<<1);n<<=1)L++;
  	for(int i=1;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
  	for(int i=0;i<len;i++)C[i]=a[i];
  	for(int i=len;i<n;i++)C[i]=0;
  	NTT(C,1,n);NTT(b,1,n);
  	for(int i=0;i<=n;i++)b[i]=1ll*(2ll-1ll*C[i]*b[i]%mod+mod)%mod*b[i]%mod;
  	NTT(b,-1,n);
  	for(int i=len;i<n;i++)b[i]=0;
}

  • 除法

       &ThinSpace; \ \ \ \ \ \ \,       会了乘法和逆元当然就会除法啦,就是套板子的事情了呢。

在这里插入图片描述
       &ThinSpace; \ \ \ \ \ \ \,       我们求多项式 A A A 除以 B B B ,那么商 Q Q Q就等于:

A ∗ I n v e r s e ( B ) A*Inverse(B) AInverse(B)

       &ThinSpace; \ \ \ \ \ \ \,        R R R 呢就等于:

A − ( G ∗ B ) A-(G*B) A(GB)

       &ThinSpace; \ \ \ \ \ \ \,       很简单吧,就不解释了,这里模板指的是 a ÷ b a\div b a÷b l a la la a a a的长度, l b lb lb b b b的长度:

int H[N];
void Division(int *a,int *b,int la,int lb,int *Quotient,int *Remainder){
	int n=la,m=lb;
	reverse(a,a+1+n),reverse(b,b+1+m);
  	int len=1;while(len<=n-m)len<<=1;
  	memset(C,0,sizeof(C));
  	Inverse(b,H,len);
  	Multiplication(a,H,Quotient,n-m,n-m);
  	reverse(Quotient,Quotient+n-m+1);
  	reverse(a,a+n+1),reverse(b,b+m+1);
  	Multiplication(Quotient,b,Remainder,n-m,m);
  	for(int i=0;i<m;++i)Remainder[i]=(a[i]-Remainder[i]+mod)%mod;
}

       &ThinSpace; \ \ \ \ \ \ \,       顺带一提,洛咕这道模板题还是蛮恶心的,主要是变量名太多了,调起来巨麻烦。

下面来两个简单的,求导和求积分

在这里插入图片描述


  • 求导

       &ThinSpace; \ \ \ \ \ \ \,       按照公式来,设多项式 A A A 的导数为 A ′ A&#x27; A

       &ThinSpace; \ \ \ \ \ \ \,       那么有:

x A ′ = A x A − 1 x^{A&#x27;}=Ax^{A-1} xA=AxA1

       &ThinSpace; \ \ \ \ \ \ \,       既:

A i ′ = i × A i + 1 A&#x27;_{i}=i\times A_{i+1} Ai=i×Ai+1

       &ThinSpace; \ \ \ \ \ \ \,       模板是把 a a a 求导到 b b b,其中的 l e n len len a a a 的长度在二进制下向上取的整数。

void Derivation(int *a,int *b,int n){
	for(int i=1;i<n;i++)
  	b[i-1]=1ll*i*a[i]%mod;
	b[n-1]=0;
}

  • 求积分

       &ThinSpace; \ \ \ \ \ \ \,       还是按照公式来,设多项式 A A A 的积分为 A ′ A&#x27; A

       &ThinSpace; \ \ \ \ \ \ \,       那么有:

∫ x A ′ d x = 1 A + 1 x A − 1 \int x^{A&#x27;}dx=\frac{1}{A+1}x^{A-1} xAdx=A+11xA1

       &ThinSpace; \ \ \ \ \ \ \,       既:

A i ′ = A i − 1 i A&#x27;_{i}=\frac{A_{i-1}}{i} Ai=iAi1

       &ThinSpace; \ \ \ \ \ \ \,       模板还是把 a a a 求积分到 b b b,其中的 l e n len len 还是 a a a 的长度在二进制下向上取的整数。

void Integral(int *a,int *b,int n){
	for(int i=1;i<n;i++)
  	b[i]=1ll*Inv(i)*a[i-1]%mod;
	b[0]=0;
}
然后看看这两个在求对数上的实际应用吧

在这里插入图片描述


  • 对数

       &ThinSpace; \ \ \ \ \ \ \,       嘛,微积分这种东西要我讲我肯定也不懂的,但是我知道公式呀:

ln ⁡ ( A ) = ∫ A ′ A d x \ln(A)=\int \frac{A&#x27;}{A}dx ln(A)=AAdx

       &ThinSpace; \ \ \ \ \ \ \,       就是它的逆卷上它的导,然后求个积分,基本上前面说的全都用上了呢,模板还是把 a a a 求对数到 b b b l e n len len 还是 a a a 的长度在二进制下向上取的整数:

int A[N],B[N];
void Logarithmic(int *a,int *b,int len){
	memset(A,0,sizeof(A));
	memset(B,0,sizeof(B));
  	Derivation(a,A,len);
  	memset(C,0,sizeof(C));
  	Inverse(a,B,len);
  	Convolution(A,B,len,len);
  	Integral(A,b,len);
}

  • 指数

       &ThinSpace; \ \ \ \ \ \ \,       这玩意说简单也简单,说复杂也挺复杂的,我们得引入一个新玩意,【牛顿迭代】,我在这里有简略的讲过:【导数和牛顿迭代】,我也在洛谷出过一个牛顿迭代的裸题,感兴趣可以去体验一下牛顿迭代的神奇:【P4986 逃离】

       &ThinSpace; \ \ \ \ \ \ \,       说远了,现在我们来康康怎么求指数函数。

       &ThinSpace; \ \ \ \ \ \ \,       令我们要求的是 A A A 的指数函数 B B B,既是:

B = e A B=e^A B=eA

       &ThinSpace; \ \ \ \ \ \ \,       变形得:

ln ⁡ ( B ) − A = 0 \ln(B)-A=0 ln(B)A=0

       &ThinSpace; \ \ \ \ \ \ \,       哇,函数零点,哭了啊,马上牛顿迭代呀!

在这里插入图片描述
       &ThinSpace; \ \ \ \ \ \ \,       不过这种套多项式的函数怎么牛顿迭代啊?我们不妨先写出来化简康康,(其实多项式也可以看做数值呀)。

       &ThinSpace; \ \ \ \ \ \ \,        F ( B ) = ln ⁡ ( B ) − A F(B)=\ln (B)-A F(B)=ln(B)A,我们要求 F F F的零点,根据牛顿迭代的公式可得(注意这里B后面的括号的迭代版本的意思,不是多项式的项):

B ( x ) = B ( x − 1 ) − F ( B ( x − 1 ) ) F ′ ( B ( x − 1 ) ) B(x)=B(x-1)-\frac{F\left(B(x-1)\right)}{F&#x27;\left(B(x-1)\right)} B(x)=B(x1)F(B(x1))F(B(x1))

       &ThinSpace; \ \ \ \ \ \ \,       而根据导数的定义, F ′ ( B ) = 1 B F&#x27;(B)=\frac{1}{B} F(B)=B1【导数和牛顿迭代】里面有提到过一点,这里是把 A A A当做常数了)

       &ThinSpace; \ \ \ \ \ \ \,       那我们现在把牛顿迭代的公式化简:

B ( x ) = B ( x − 1 ) − B ( x − 1 ) ∗ F ( B ( x − 1 ) ) = B ( x − 1 ) − B ( x − 1 ) ∗ ln ⁡ ( B ( x − 1 ) ) − A = B ( x − 1 ) ∗ ( 1 − ln ⁡ ( B ( x − 1 ) ) − A ) \begin{aligned} B(x)&amp; =B(x-1)-B(x-1)*F\left(B(x-1)\right)\\&amp; =B(x-1)-B(x-1)*\ln \left(B(x-1)\right)-A\\&amp; =B(x-1)* \left(1-\ln \left(B(x-1)\right)-A \right) \end{aligned} B(x)=B(x1)B(x1)F(B(x1))=B(x1)B(x1)ln(B(x1))A=B(x1)(1ln(B(x1))A)

       &ThinSpace; \ \ \ \ \ \ \,       再次强调B后面的括号的迭代版本的意思,不是多项式的项。

       &ThinSpace; \ \ \ \ \ \ \,       现在看似分治可做,我们用两个容器相互装版本。每次老版本一卷,新版本长度就会倍增,所以说我们做 log ⁡ n \log n logn 次迭代就好。我们的操作相当于把式子拆了求收敛值,所以不会有精度的问题,求出来就好了。

       &ThinSpace; \ \ \ \ \ \ \,       那么现在的问题是,第一个版本怎么样,洛咕模板给的是保证 A 0 = 0 A_0=0 A0=0,所以说 B 0 = 1 B_0=1 B0=1,也就是常数项为 1 1 1

       &ThinSpace; \ \ \ \ \ \ \,       看到这里感觉很难很绕,不过没关系,模板挺短的,光记模板也可以吧。
在这里插入图片描述

       &ThinSpace; \ \ \ \ \ \ \,       模板还是把 a a a 求指数到 b b b l e n len len 还是 a a a 的长度在二进制下向上取的整数:

int D[N];
void Exponential(int *a,int *b,int len){
  	if(len==1){b[0]=1;return;}
  	Exponential(a,b,len>>1),Logarithmic(b,D,len);
  	D[0]=(1ll*a[0]+1ll-D[0]+mod)%mod;
  	for(int i=1;i<len;++i) D[i]=(1ll*a[i]-D[i]+mod)%mod;
  	Convolution(b,D,len<<1,len<<1);
  	for(int i=len;i<(len<<1);++i) b[i]=D[i]=0;
}
有了指数和对数这两个工具,多项式可以干的事情就太多了,比如说开 k k k次方根,快速幂什么的。

  • 开根

       &ThinSpace; \ \ \ \ \ \ \,       我们知道对于一个数 a b a^b ab k k k次方
a b k = a b k \sqrt[k]{a^b}=a^{\frac{b}{k}} kab =akb

       &ThinSpace; \ \ \ \ \ \ \,       那么对于一个多项式 A A A k k k 次方也同理:

A k = e ln ⁡ ( A ) k \sqrt[k]{A}=e^{\frac{\ln(A)}{k}} kA =ekln(A)

       &ThinSpace; \ \ \ \ \ \ \,       好像有更快的方法,不过这个方法挺显然简单的,模板也很简单了,模板还是把 a a a 求指数到 b b b l e n len len 还是 a a a 的长度在二进制下向上取的整数 (说吐了)

       &ThinSpace; \ \ \ \ \ \ \,       对了,求 E X P EXP EXP 时,常数项还需注意单独求,复杂的话会涉及高次剩余,就不多赘述了, s o l v e ( a , K ) solve(a,K) solve(a,K) 函数就是求高次剩余的,表示 a a a在模 m o d mod mod的情况下的 k k k次剩余,也可以BSGS水,感兴趣可以看看这里:题解 P5277 【【模板】多项式开根(加强版)】

int E[N];
void Kth_root(int *a,int *b,int len,int k){
	Logarithmic(a,E,len);
	int bot=Inv(k);
	for(int i=1;i<=len;i++)E[i]=1ll*E[i]*bot%mod;
	b[0]=solve(a[0],K);
	Exponential(E,b,len);
}

  • 快速幂

       &ThinSpace; \ \ \ \ \ \ \,       快速幂和开根同理啦,直接给代码咯,就是注意求 E X P EXP EXP 时,常数项不是 1 1 1 了,注意改一改,为什么可以这样搞我放在这里了,有兴趣可以看一看: 题解 P5273 【【模板】多项式幂函数 (加强版)】

int P[N];
void Fast_Power(int *a,int *b,int len,int k){
	Logarithmic(a,P,len);
	for(int i=1;i<=len;i++)P[i]=1ll*E[i]*k%mod;
  	b[0]=power(a[0],k);
	Exponential(P,b,len);
}

  • 多项式三角函数

       &ThinSpace; \ \ \ \ \ \ \,       先有一个神奇的欧拉公式:

e i x = cos ⁡ x + i ⋅ sin ⁡ x e^{ix}=\cos x+i\cdot \sin x eix=cosx+isinx

       &ThinSpace; \ \ \ \ \ \ \,       容易变换得到:

sin ⁡ x = e i x − e − i x 2 i \sin x=\frac{e^{ix}-e^{-ix}}{2i} sinx=2ieixeix

cos ⁡ x = e i x + e − i x 2 \cos x=\frac{e^{ix}+e^{-ix}}{2} cosx=2eix+eix

       &ThinSpace; \ \ \ \ \ \ \,       那么对于一个多项式 A A A

sin ⁡ x = e i ⋅ A − e − i ⋅ A 2 i \sin x=\frac{e^{i\cdot A}-e^{-i\cdot A}}{2i} sinx=2ieiAeiA

cos ⁡ x = e i ⋅ A + e − i ⋅ A 2 \cos x=\frac{e^{i\cdot A}+e^{-i\cdot A}}{2} cosx=2eiA+eiA

       &ThinSpace; \ \ \ \ \ \ \,       然后就是多项式求指数函数了,贴板,问题不大……

       &ThinSpace; \ \ \ \ \ \ \,       诶等等,这个 i i i 怎么办啊?怎么取模?

在这里插入图片描述

       &ThinSpace; \ \ \ \ \ \ \,       不慌,我们来回忆一下 i i i 是个什么东西:

i = − 1 i=\sqrt{-1} i=1

i 2 = − 1 i^2=-1 i2=1

       &ThinSpace; \ \ \ \ \ \ \,       所以说,在模的意义下:

i 2 ≡ m o d − 1      ( % m o d ) i^2\equiv mod-1\ \ \ \ (\%mod) i2mod1    (%mod)

       &ThinSpace; \ \ \ \ \ \ \,       哇!二次剩余诶!(可是我不会,死了)

       &ThinSpace; \ \ \ \ \ \ \,       有原根的模数,还需要求二次剩余吗?

在这里插入图片描述
       &ThinSpace; \ \ \ \ \ \ \,       当然是 B S G S BSGS BSGS乱搞啊:

       &ThinSpace; \ \ \ \ \ \ \,       令已知原根是 g g g,设 i = g x i=g^x i=gx 所以原式化为:

g 2 x % m o d = m o d − 1 g^{2x}\%mod=mod-1 g2x%mod=mod1

       &ThinSpace; \ \ \ \ \ \ \,        B S G S BSGS BSGS即可求出 2 x 2x 2x 的取值,便可以求出 i i i

       &ThinSpace; \ \ \ \ \ \ \,       不过在模数是 998244353 998244353 998244353的情况下,我们已经算出来是下面这样的,可以直接用了:

const int img=86583718;

       &ThinSpace; \ \ \ \ \ \ \,       然后就是贴板子了, a a a, b b b, l e n len len的意义同上,不重复说了, t a n tan tan的话,再加个求逆,不说了:

int Sin_x[N],Sin_y[N],Sin_z[N];
void Sin(int *a,int *b,int len){
	for(int i=0;i<=len;i++)Sin_x[i]=1ll*img*a[i]%mod;
  	memset(Exp_x,0,sizeof(Exp_x));
	Exponential(Sin_x,Sin_y,len);
	for(int i=0;i<=len;i++)Sin_x[i]=(1ll*mod-(1ll*img*a[i]%mod))%mod;
  	memset(Exp_x,0,sizeof(Exp_x));
	Exponential(Sin_x,Sin_z,len);
	int bot=Inv(2ll*img%mod);
	for(int i=0;i<=len;i++)b[i]=1ll*(Sin_y[i]-Sin_z[i]+mod)%mod*bot%mod;
}
int Cos_x[N],Cos_y[N],Cos_z[N];
void Cos(int *a,int *b,int len){
	for(int i=0;i<=len;i++)Cos_x[i]=1ll*img*a[i]%mod;
  	memset(Exp_x,0,sizeof(Exp_x));
	Exponential(Cos_x,Cos_y,len);
	for(int i=0;i<=len;i++)Cos_x[i]=(1ll*mod-(1ll*img*a[i]%mod))%mod;
  	memset(Exp_x,0,sizeof(Exp_x));
	Exponential(Cos_x,Cos_z,len);
	int bot=Inv(2);
	for(int i=0;i<=len;i++)b[i]=1ll*(Cos_y[i]+Cos_z[i])%mod*bot%mod;
}

  • 多项式反三角函数

       &ThinSpace; \ \ \ \ \ \ \,       嘛,这个还是套模板呢,先给公式吧,一般也搜得到下面公式的推导,是关于多项式 A A A的三角函数:

       &ThinSpace; \ \ \ \ \ \ \,       根据三角函数求导公式:

d d x a s i n ( x ) = 1 − x 2 + 1 \frac{d}{dx}asin(x)=\frac{1}{\sqrt{-x^2+1}} dxdasin(x)=x2+1 1

d d x a t a n ( x ) = 1 x 2 + 1 \frac{d}{dx}atan(x)=\frac{1}{x^2+1} dxdatan(x)=x2+11

       &ThinSpace; \ \ \ \ \ \ \,       所以显然有

a s i n ( A ) = ∫ A ′ − A 2 + 1 d x asin(A)=\int{\frac{A&#x27;}{\sqrt{-A^2+1}}}dx asin(A)=A2+1 Adx

a t a n ( A ) = ∫ A ′ A 2 + 1 d x atan(A)=\int{\frac{A&#x27;}{A^2+1}}dx atan(A)=A2+1Adx

       &ThinSpace; \ \ \ \ \ \ \,       套模板: a a a, b b b, l e n len len的意义同上:

int Asin_x[N],Asin_y[N],Asin_z[N];
void Asin(int *a,int *b,int len){
  	Derivation(a,Asin_x,len);
	int n=len,m=len;
  	int L=0;for(m+=n,n=1;n<=m;n<<=1)L++;
  	for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
	for(int i=0;i<=len;++i) Asin_y[i]=a[i];
  	NTT(Asin_y,1,n);
  	for(int i=0;i<=n;i++)Asin_y[i]=1ll*Asin_y[i]*Asin_y[i]%mod;
  	NTT(Asin_y,-1,n);
  	for(int i=0;i<=n;i++)Asin_y[i]=(mod-Asin_y[i]);
	Asin_y[0]=(1+Asin_y[0])%mod;
  	Kth_root(Asin_y,Asin_z,len,2);
  	memset(Asin_y,0,sizeof(Asin_y));
  	Inverse(Asin_z,Asin_y,len);
  	Convolution(Asin_x,Asin_y,len,len);
  	Integral(Asin_x,b,len);
}
int Atan_x[N],Atan_y[N],Atan_z[N];
void Atan(int *a,int *b,int len){
	Derivation(a,Atan_x,len);
	int n=len,m=len;
  	int L=0;for(m+=n,n=1;n<=m;n<<=1)L++;
  	for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
	for(int i=0;i<=len;++i) Atan_y[i]=a[i];
  	NTT(Atan_y,1,n);
  	for(int i=0;i<=n;i++)Atan_y[i]=1ll*Atan_y[i]*Atan_y[i]%mod;
  	NTT(Atan_y,-1,n);
	Atan_y[0]=(1+Atan_y[0])%mod;
  	Inverse(Atan_y,Atan_z,len);
  	Convolution(Atan_x,Atan_z,len,len);
  	Integral(Atan_x,b,len);
}

       &ThinSpace; \ \ \ \ \ \ \,        你问我 a c o s acos acos ? 大同小异就不放了 (其实是洛咕没有这板子)


       &ThinSpace; \ \ \ \ \ \ \,       差不多基础操作就这么多了吧。多点求值的话,正解两个 log ⁡ \log log还带大常数,周道觉得不如写暴力卡卡常,快速插值呢,没有计划去学,拉格朗日差值可以做到 O ( n 2 ) O(n^2) O(n2)的复杂度,有兴趣可以去看看【拉格朗日插值法】。虽然感觉很多时候还不够用,不过目前应该不会怎么遇到差值的题吧(奶。
在这里插入图片描述
       &ThinSpace; \ \ \ \ \ \ \,       明天找时间开这个东西:#150. 挑战多项式

       &ThinSpace; \ \ \ \ \ \ \,        2.22 Update:太恶心了,放弃了,有机会找时间慢慢调。
在这里插入图片描述

       &ThinSpace; \ \ \ \ \ \ \,        4.1 Update:周道终于写出来了!!!!

【没有结构体,没有封装,大常数预警(代码链接)】

       &ThinSpace; \ \ \ \ \ \ \,       截止周道提交时间,周道喜提全网最慢代码,全网第三大空间代码!

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值