由於不會作目錄因此請善用ctrl+F算法
原本想的是筆記之類的,寫着寫着就變成了資源整理數組
\(f'(x)=\lim\limits_{\triangle x\rightarrow 0}\frac{f(x+\triangle x)-f(x)}{\triangle x}\)函數
\(\sin x:\cos x\)ui
\(\cos x:-\sin x\)this
\(\ln x:\frac{1}{x}\)lua
\(e^x:e^x\)spa
\(x^n:nx^{n-1}\).net
\(\log_a^x:\frac{1}{x\ln a}\)code
\(a^x:a^x\ln a\)blog
\([af(x)+bg(x)]'=af'(x)+bg'(x)\)
\([f(x)g(x)]'=f(x)g'(x)+f'(x)g(x)\)
\([\frac{f(x)}{g(x)}]'=\frac{f'(x)}{g(x)}-\frac{f(x)g'(x)}{g^2(x)}\)
\([f(g(x))]'=f'(g(x))\times g'(x)\)
\(x_i=x_{i-1}-\frac{f(x_{i-1})}{f'(x_{i-1})}\)
\(f(x)=\sum\limits_{i=0}^{\infty }\frac{f^{(i)}(x_0)(x-x_0)^i}{i!}\)
\(f(x)=\sum\limits_{i=0}^{\infty}\frac{f^{(i)}(0)}{i!}x^i\) (麥克勞林級數)
是泰勒公式的特殊形式。
\(ln(1-x)=\sum\limits_{i}-\frac{x^i}{i}\)
\(e^x=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}\)
\(sin(x)=\sum\limits_{i=0}^{\infty}(-1)^i\frac{x^{2i+1}}{(2i+1)!}\)
\(cos(x)=\sum\limits_{i=0}^{\infty}(-1)^i\frac{x^{2i}}{(2i)!}\)
\(\frac{1}{(1-x)^n}=\sum\limits_{i=0}^{\infty}\binom{i+n-1}{n-1}x^i\) (能夠用生成函數理解)
一個結論:\(e^{ix}=cos(x)+i\times sin(x)\)
\(\sum\limits_{i=1}^{n}y_i\prod\limits_{j!=i}\frac{(x-x_j)}{(x_i-x_j)}\)
\(C=B\times (2-AB)\)
(由於太常見我就不推了)
\((B-C)=0\)
\(B^2+C^2+2BC=0\)
\(B^2+A+2BC=0\)
\(C=(A/B+B)/2\)
這裏插一個二次剩餘的Cipolla算法
要求\(x^2=n\)
隨一個\(t\),使得\((t^2-n)^{(p-1)/2}=p-1\)
設\(I=t^2-n\)
那麼答案就是\((t+\sqrt I)^{(p+1)/2}\)
\(B=lnA\)
\(B'=\frac{A'}{A}\)
(不用倍增!固然倍增也不會錯複雜度也同樣)
\(B=e^A\)
\(lnB=A\)
\(lnB-A=0\)
\(B=B-(lnB-A)\times B=B\times (1-lnB+A)\)
for(i=1;i<len;i++)b[i-1]=a[i]*i;
for(i=1;i<len;i++)b[i]=a[i-1]*inv[i];
\(B(x)=A(x)^n\)
\(lnB(x)=nlnA(x)\)
常數項不爲\(1\)須要特殊處理。
https://blog.csdn.net/xyz32768/article/details/82832467
定義\(A_R\)知足\(A_R[i]=A[n-i]\)。
\(F(x)=Q(x)G(x)+R(x)\) \((deg(F)=n,deg(G)=m,deg(Q)=n-m,deg(R)=m-1)\)
\(F(\frac{1}{x})=Q(\frac{1}{x})G(\frac{1}{x})+R(\frac{1}{x})\)
同乘\(x^n\),得\(F_R(x)=Q_R(x)G_R(x)+R_R(x)x^{n-m+1}\)
\(F_R(x)=Q_R(x)G_R(x)(mod\ x^{n-m+1})\)
\(Q_R=F_R/G_R\)
\(A\ mod\ B=A-\lfloor \frac{A}{B}\rfloor A\)
對於\(F(x)\)和\(x_1,x_2,...x_m\)求出\(F(x_1),F(x_2),...,F(x_m)\)。
思路就是分治,同時利用多項式取模減小多項式的次數。
先計算\(G_{ls}=\prod\limits_{i=l}^{mid}(x-x_i),G_{rs}=\prod\limits_{i=mid+1}^r(x-x_i)\)
對於左邊的全部\(x_i\),在\(G_{ls}\)下的點值都是\(0\),所以能夠把\(F\)變成\(F\ mod\ G_{ls}\),右邊同理。
\(F(x)=\sum\limits_{i=1}^n\frac{\prod_{j!=i}(x-x_j)}{\prod_{j!=i}(x_i-x_j)}y_i\)
考慮求出\(\prod_{j!=i}(x_i-x_j)\),設\(M(x)=\prod_{i=1}^n(x−x_i)\),那麼咱們就是要求\(\frac{M(x)}{x-x_i}\)。
\(x=x_i\),根據洛必達法則,得這個式子就等於\(M'(x_i)\),能夠多點求值求出這個。
設\(v_i=\frac{y_i}{\prod_{j!=i}(x_i-x_j)}\),咱們要求的就是\(\sum\limits_{i=1}^nv_i\prod_{j!=i}(x-x_j)\)
一樣分治便可。
板子:
#include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> using namespace std; typedef long long ll; typedef unsigned long long ull; #define mod 998244353 #define N 400050 char buf[100000],*p1,*p2; #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++) int rd() { int x=0; char s=nc(); while(s<'0') s=nc(); while(s>='0') x=(((x<<2)+x)<<1)+s-'0',s=nc(); return x; } int inv[N],ntt_w[2][N],mem[N*100],*ptr=mem; int A[N],B[N],C[N],D[N],E[N],F[N],G[N],inv2=(mod+1)/2; int qp(int x,int y=mod-2) { int re=1;for(;y;y>>=1,x=ll(x)*x%mod)if(y&1)re=ll(re)*x%mod; return re; } int INV(int x) {return qp(x,mod-2);} namespace Cipolla { int I; struct cp { int x,y; cp(){} cp(int x_,int y_) {x=x_,y=y_;} cp operator * (const cp &u) const { return cp((ll(x)*u.x+ll(y)*u.y%mod*I)%mod,(ll(x)*u.y+ll(y)*u.x)%mod); } }; bool check(int x) {return qp(x,(mod-1)/2)==1;} int Sqrt(int n) { srand(123123); rand(); int t=rand()%mod;while(check((ll(t)*t-n)%mod))t=rand()%mod; I=((ll(t)*t-n)%mod+mod)%mod; cp re=cp(1,0),x=cp(t,1); int y=(mod+1)/2; for(;y;y>>=1,x=x*x)if(y&1)re=re*x; re.x=(re.x+mod)%mod; return min(re.x,mod-re.x); } } using namespace Cipolla; void ntt_init(int l) { int j,k,t,w,wn,i; for(k=2;k<=l;k<<=1) {t=k>>1; wn=qp(3,(mod-1)/k); w=1; for(j=0;j<t;j++) ntt_w[0][t+j]=w,w=ll(w)*wn%mod; wn=INV(wn); w=1; for(j=0;j<t;j++) ntt_w[1][t+j]=w,w=ll(w)*wn%mod; }inv[1]=1;for(i=2;i<=l;i++) inv[i]=ll(mod-mod/i)*inv[mod%i]%mod; } inline int Md(int x) {return x>=mod?(x-mod):x;} void ntt(int *a,int len,int flg) { int i,j,k,t,tmp,o=flg!=1; static ull F[N]; for(i=0;i<len;i++)F[i]=(a[i]+mod)%mod; for(i=k=0;i<len;i++) { if(i>k) swap(F[i],F[k]); for(j=len>>1;(k^=j)<j;j>>=1); }for(k=2;k<=len;k<<=1) { t=k>>1;for(i=0;i<len;i+=k) for(j=i;j<i+t;j++) { tmp=F[j+t]*ntt_w[o][j-i+t]%mod; F[j+t]=(F[j]+mod-tmp); F[j]=(F[j]+tmp); } } for(i=0;i<len;i++) a[i]=F[i]%mod; if(flg==-1)for(tmp=inv[len],i=0;i<len;i++)a[i]=ll(a[i])*tmp%mod; } void get_inv(int*,int*,int,int); void get_root(int*,int*,int,int); void get_ln(int*,int*,int,int); void get_exp(int*,int*,int,int); struct cirno { int *a,len; cirno(){} cirno(int l) {len=l,a=ptr,ptr+=l;} void fix(int l) {len=l,a=ptr,ptr+=l;} void rev() {reverse(a,a+len);} void get_mod(int l) {int i;for(i=l;i<=len;i++) a[i]=0; len=l;} cirno operator + (const cirno &u) const { cirno re(max(len,u.len)); int i; for(i=0;i<re.len;i++) { re.a[i]=((i<len?a[i]:0)+(i<u.len?u.a[i]:0))%mod; }return re; } cirno operator - (const cirno &u) const { cirno re(len); int i; for(i=0;i<len;i++) { if(i>=u.len)re.a[i]=a[i]; else re.a[i]=(a[i]-u.a[i]+mod)%mod; }return re; } cirno operator * (const cirno &u) const { cirno re(len+u.len-1); int i,j,l=1; if(re.len<=200) { for(i=0;i<len;i++) if(a[i]) for(j=0;j<u.len;j++) re.a[i+j]=(re.a[i+j]+ll(a[i])*u.a[j])%mod; return re; } while(l<(len+u.len)) l<<=1; memset(A,0,l<<2); memset(B,0,l<<2); memcpy(A,a,len<<2); memcpy(B,u.a,u.len<<2); ntt(A,l,1),ntt(B,l,1); for(i=0;i<l;i++) A[i]=ll(A[i])*B[i]%mod; ntt(A,l,-1); memcpy(re.a,A,re.len<<2); return re; } cirno Get_dao() { cirno re(len-1); int i; for(i=1;i<len;i++) re.a[i-1]=ll(i)*a[i]%mod; return re; } cirno Get_jifen() { cirno re(len+1); int i; for(i=1;i<len;i++) re.a[i]=ll(inv[i])*a[i-1]%mod; return re; } cirno Get_inv(int l) const { cirno re(l); get_inv(a,re.a,l,len); return re; } cirno Get_root(int l) const { cirno re(l); get_root(a,re.a,l,len); return re; } cirno Get_ln(int l) const { cirno re(l); get_ln(a,re.a,l,len); return re; } cirno Get_exp(int l) const { cirno re(l); get_exp(a,re.a,l,len); return re; } cirno Get_pow(int k,int l) const { cirno u=Get_ln(l); int i; for(i=0;i<l;i++) u.a[i]=ll(u.a[i])*k%mod; cirno re=u.Get_exp(l); return re; } cirno operator / (cirno u) { int n=len,m=u.len,l=1; while(l<(n-m+1))l<<=1; rev(),u.rev(); cirno v=u.Get_inv(l); v.get_mod(n-m+1); cirno re=(*this)*v; rev(),u.rev(); re.get_mod(n-m+1); re.rev(); return re; } cirno operator % (cirno u) { cirno re=*this-u*(*this/u); re.get_mod(u.len-1); return re; } }tr[N<<2]; char pbuf[2000000],*pp=pbuf; void write(int x) { static int sta[20],tp=0; do {sta[++tp]=x%10,x/=10;}while(x); while(tp)*pp++=sta[tp--]+'0'; *pp++=' '; } void get_inv(int *a,int *b,int len,int la) { if(len==1) {b[0]=qp(a[0]); return ;} get_inv(a,b,len>>1,la); int l=len<<1,i; memset(A,0,l<<2); memset(B,0,l<<2); memcpy(A,a,min(len,la)<<2); memcpy(B,b,len<<2); ntt(A,l,1),ntt(B,l,1); for(i=0;i<l;i++) A[i]=B[i]*(mod+2-ll(A[i])*B[i]%mod)%mod; ntt(A,l,-1); memcpy(b,A,len<<2); } void get_root(int *a,int *b,int len,int la) { if(len==1) {b[0]=Sqrt(a[0]); return ;} get_root(a,b,len>>1,la); int l=len<<1,i; memset(C,0,l<<2); memset(D,0,l<<2); memset(E,0,l<<2); memcpy(C,a,min(len,la)<<2); memcpy(D,b,len<<2); get_inv(b,E,len,len); ntt(C,l,1),ntt(D,l,1),ntt(E,l,1); for(i=0;i<l;i++) C[i]=(ll(C[i])*E[i]+D[i])%mod*inv2%mod; ntt(C,l,-1); memcpy(b,C,len<<2); } void get_dao(int *a,int *b,int len) { int i; for(i=1;i<len;i++) b[i-1]=ll(i)*a[i]%mod; b[len-1]=0; } void get_jifen(int *a,int *b,int len) { int i; for(i=1;i<len;i++) b[i]=ll(inv[i])*a[i-1]%mod; b[0]=0; } void get_ln(int *a,int *b,int len,int la) { int l=len<<1,i; memset(F,0,l<<2); memset(G,0,l<<2); get_dao(a,F,min(len,la)); get_inv(a,G,len,la); ntt(F,l,1),ntt(G,l,1); for(i=0;i<l;i++) F[i]=ll(F[i])*G[i]%mod; ntt(F,l,-1); get_jifen(F,b,len); } void get_exp(int *a,int *b,int len,int la) { if(len==1) {b[0]=1; return ;} get_exp(a,b,len>>1,la); int l=len<<1,i; memset(C,0,l<<2); memset(D,0,l<<2); memcpy(C,b,len<<2); get_ln(b,D,len,len); for(i=0;i<len;i++) D[i]=(i<la?a[i]:0)-D[i]; D[0]++; ntt(C,l,1),ntt(D,l,1); for(i=0;i<l;i++) C[i]=ll(C[i])*D[i]%mod; ntt(C,l,-1); memcpy(b,C,len<<2); } #define ls p<<1 #define rs p<<1|1 void build(int l,int r,int p,int *px) { if(l==r) { tr[p].fix(2); tr[p].a[0]=mod-px[l]; tr[p].a[1]=1; return ; } int mid=(l+r)>>1; build(l,mid,ls,px),build(mid+1,r,rs,px); tr[p]=tr[ls]*tr[rs]; } void get_val(cirno F,int l,int r,int p,int *px,int *re) { if(F.len<=450) { int i,j,t; for(i=l;i<=r;i++) { ull tmp=0; for(j=0,t=1;j<F.len;j++,t=ll(t)*px[i]%mod) { tmp=(tmp+ll(t)*F.a[j])%mod; if(!(j&7))tmp%=mod; } re[i]=tmp%mod; }return ; } int mid=(l+r)>>1; get_val(F%tr[ls],l,mid,ls,px,re); get_val(F%tr[rs],mid+1,r,rs,px,re); } cirno solve_polate(int l,int r,int p,int *tmp) { if(l==r) { cirno re(1); re.a[0]=tmp[l]; return re; } int mid=(l+r)>>1; cirno L=solve_polate(l,mid,ls,tmp); cirno R=solve_polate(mid+1,r,rs,tmp); return L*tr[rs]+R*tr[ls]; } void Evaluate(int *px,int *re,cirno F,int m) { build(1,m,1,px); get_val(F,1,m,1,px,re); } cirno Interpolate(int *px,int *py,int n) { int i; build(1,n,1,px); cirno a=tr[1].Get_dao(); static int t[N]; get_val(a,1,n,1,px,t); for(i=1;i<=n;i++) t[i]=ll(qp(t[i]))*py[i]%mod; return solve_polate(1,n,1,t); } int main() { //LOJ 150 int n,K,l=1; n=rd()+1; K=rd(); while(l<n)l<<=1; ntt_init(l<<1); int i; cirno a(n); for(i=0;i<n;i++) a.a[i]=rd(); cirno b=a.Get_root(l); cirno c=b.Get_inv(l); cirno d=c.Get_jifen(); cirno e=d.Get_exp(l); for(i=0;i<l;i++) e.a[i]=-e.a[i]; for(i=0;i<n;i++) e.a[i]=(e.a[i]+a.a[i])%mod; e.a[0]+=2, e.a[0]=(e.a[0]-a.a[0])%mod; cirno f=e.Get_ln(l); f.a[0]++; cirno g=f.Get_pow(K,l); cirno ans=g.Get_dao(); for(i=0;i<n-1;i++) write((ans.a[i]+mod)%mod); fwrite(pbuf,1,pp-pbuf,stdout); //Luogu qiuzhi /*int n,m; n=rd(),m=rd(); int i,l=1; while(l<=(n+n))l<<=1; ntt_init(l); cirno a(n+1); static int px[N],ans[N]; for(i=0;i<=n;i++) a.a[i]=rd(); for(i=1;i<=m;i++) px[i]=rd(); Evaluate(px,ans,a,m); for(i=1;i<=m;i++)printf("%d\n",ans[i]);*/ //Luogu chazhi /*int n,i,l=1; n=rd(); static int px[N],py[N]; while(l<=(n+n))l<<=1; ntt_init(l); for(i=1;i<=n;i++)px[i]=rd(),py[i]=rd(); cirno a=Interpolate(px,py,n); for(i=0;i<n;i++)printf("%d ",a.a[i]);*/ }
\(A(B(x))\)
\(F(x),G(x)\),\(F(G(x))=x\) 稱\(F(x)\)和\(G(x)\)互爲複合逆。
若\(F(x)\)是\(G(x)\)的複合逆,那麼知足\([x^n]F(x)=\frac{1}{n}[x^{n-1}](\frac{x}{G(x)})^n\)
推廣形式:\([x^n]H(F(x))=\frac{1}{n}[x^{n-1}]H'(x)(\frac{x}{G(x)})^n\)
https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p4723
https://blog.csdn.net/qq_35649707/article/details/78688235
對於懶得推式子選手能夠選擇記結論:
\(A^n=\sum\limits_{i=0}^{k-1}c_iA^i\)
\(St\times A^n=\sum\limits_{i=0}^{k-1}c_iSt\times A^i\)
\(ans=[0](St\times A^n)=\sum\limits_{i=0}^{k-1}c_i[0](St\times A^i)\)
\(ans=\sum\limits_{i=0}^{k-1}c_iSt_i\)
\(A^n=Q(A)G(A)+\sum\limits_{i=0}^{k-1}c_iA^i\)
\(g_{k-i}=-a_i\)
乘法和取模能夠\(O(k^2)\)或\(O(k\log k)\)實現。
https://www.luogu.org/blog/ShadowassIIXVIIIIV/sheng-cheng-han-shuo-xia-chui
給定一個形如\(x_1+x_2+…+x_m=n\)的方程,求非負整數解的數量,其中\(x_i\)知足:\(x_1\)必須是個偶數\(x_2\)必須是個質數\(x_3\)的\(μ\)值不能爲\(0\),\(x_4\)必須是一個windy數
給定一些紅球、黃球、藍球和綠球,將其組成一個長度爲\(n\)的序列,要求:紅球必須有偶數個,白球數量必須是個質數,藍球數量的\(μ\)值不能爲\(0\),綠球數量必須是個windy數
給定\(n\)個彼此不一樣的小球,要求劃分爲一些集合,每一個集合的生成函數是\(F(x)\),求方案數
樹:\(A(x)=\sum_{n\ge 0}\frac{n^{n-2}}{n!}x^n\)
森林:\(expA(x)\)
無向圖:\(C(x)=\sum_{n\ge 0}\frac{2^{\binom{n}{2}}}{n!}x^n\)
無向連通圖\(lnC(x)\)
or卷積和and卷積很好理解
xor卷積看這個https://blog.csdn.net/neither_nor/article/details/60335099
這個對於or和and仍是一個前綴和的性質。
對於xor..顯然我不知道\(m\)進制下的異或有什麼意義。
大概就是求這麼一個式子\(A_i=\sum\limits_{j+k=i,j\&k=0}B_j\times C_k\)
用佔位多項式搞一搞便可,多開一維數組存\(1\)的個數,揹包合併。
\(\begin{bmatrix} n\\ k \end{bmatrix}\) 表示將\(n\)個不一樣元素分紅\(k\)個不一樣環的方案數,當且僅當兩個環不可經過旋轉獲得時,則兩個環不相同。
\(\begin{bmatrix} 0\\ 0 \end{bmatrix}=1,\begin{bmatrix} n\\ k \end{bmatrix}=\begin{bmatrix} n-1\\ k-1 \end{bmatrix}+\begin{bmatrix} n-1\\ k \end{bmatrix}\times (n-1)\) (可能獨立成環也能夠接到前面某個數的後面。)
\(\sum\limits_{k=0}^n\begin{bmatrix} n\\ k \end{bmatrix}=n!\) (\(\begin{bmatrix} n\\ k \end{bmatrix}\)剛好是\(n\)個元素包含\(k\)個輪換的排列個數)
\(x^{\overline n}=\sum_{k}\begin{bmatrix}n\\ k\end{bmatrix}x^k\) (證實直接帶遞推式子進去就行,固然也能夠用這個式子來定義斯特林數)
\(x^{\underline n}=\sum_{k}\begin{bmatrix}n\\ k\end{bmatrix}(-1)^{n-k}x^k\) (這裏的\(\begin{bmatrix}n\\ k\end{bmatrix}(-1)^{n-k}\)其實就是有符號第一類斯特林數了)
求一行第一類斯特林數:
由2式能直接得出一個\(O(n\log n^2)\)的作法,這裏說一下\(O(n\log n)\)的作法。
分治,假設咱們已經求出來\(x^{\overline n}\),如何求出\(x^{\overline 2n}\)或\(x^{\overline {n+1}}\) 。
對於後者,能夠直接\(O(n)\)乘一下,對於前者,至關於要求\(x^{\overline n}\times (x+n)^{\overline n}\)
設\(f(x)=\sum\limits_{i=0}^{n}f_ix^i,g(x)=\sum\limits_{i=0}^{n}g_ix_i\),分別是上式左右的生成函數。
\(g(x)=\sum\limits_{i=0}^nf_i(x+n)^i\)
\(g(x)=\sum\limits_{i=0}^nf_i\sum\limits_{j=0}^jx^jn^{i-j}\binom{i}{j}\)
\(g(x)=\sum\limits_{j=0}^n\frac{x^j}{j!}\sum\limits_{i=j}^nf_ii!\frac{n^{i-j}}{(i-j)!}\)
卷積形式,直接\(O(n\log n)\)乘一下。
總的時間複雜度仍是\(O(n\log n)\)的。
\(\begin{Bmatrix}n\\ k\end{Bmatrix}\)表示將n個元素分紅k個非空集合的方案數,集合內是無序數。
\(\begin{Bmatrix}n\\ k\end{Bmatrix}=\begin{Bmatrix}n-1\\k-1\end{Bmatrix}+k\times \begin{Bmatrix} n-1\\ k \end{Bmatrix}\)
\(x^n=\sum_k\begin{Bmatrix}n\\ k\end{Bmatrix}x^{\underline k}\) (展開可證,組合意義即\(x\)種顏色的球選\(n\)次\(=\)枚舉一共選了\(k\)種顏色劃分的方案數乘從\(x\)中顏色選出\(k\)個進行排列的方案數)
\(x^n=\sum_k\begin{Bmatrix}n\\ k\end{Bmatrix}(-1)^{n-k}x^{\overline k}\)
\(\begin{Bmatrix}n\\k\end{Bmatrix}=\frac{1}{k!}\sum\limits_{i=0}^k(-1)^i\binom{i}{k}(k-i)^n\) (就是令集合間有序,而後枚舉有幾個集合是空的進行容斥)
求一行第二類斯特林數:
能夠把第一類的1式,第二類的1,2式合起來,獲得\(\sum\limits_{k=p}^n\begin{Bmatrix}n\\k\end{Bmatrix}\begin{bmatrix}k\\p\end{bmatrix}(-1)^{n-k}=[p=n]\),而後就能夠愉快的進行反演,得
\[ f_n=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g_i \\ g_n=\sum\limits_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}f_i \]
https://blog.csdn.net/DT_Kang/article/details/79944113
\(\frac{1}{n}\sum\limits_{i=0}^{n-1}w^{ki}=[n|k]\)
從\(2\)開始枚舉\(g\),檢查是否對於全部的\(q,is[q],q|\varphi(p)\)都知足\(g^{\frac{phi}{q}}\not =1\) 。
https://blog.csdn.net/zhouyuheng2003/article/details/88527913
\((1+x)^{-n}=\sum\limits_{i=0}^{\infty}(-1)^{i}\binom{n+i-1}{i}\)
\((1-x)^{-n}=\sum\limits_{i=0}^{n\infty}\binom{n+i-1}{i}\)