1. 程式人生 > 實用技巧 >省選數學複習

省選數學複習

複數運算

\((a,bi),(c,di)\)

加法:\((a+c,(b+d)i)\)

減法:\((a-c,(b-d)i)\)

乘法:\((ac-bd,(bc+ad)i)\)

除法:

\[\frac{a+bi}{c+di}=\frac{(a+bi)*(c-di)}{(c+di)*(c-di)}=\frac{ac+bd}{c^2+d^2}+\frac{bc-ad}{c^2+d^2}i \]

二次剩餘

模數為奇素數用\(cipolla\)

inline int cipolla(int n){
	n%=mod;//
	if(ksm(n,mod>>1)==mod-1)return -1;
	int x;
	while(1){
		x=rand()%mod;//
		sq=((ll)x*x-n+mod)%mod;//
		if(ksm(sq,mod>>1)==mod-1)break;//
	} 
	return (cpow(complx(x,1),mod+1>>1).x+mod)%mod;
}

BSGS

inline int bsgs(int x,int c){
	if(!x)return c?-1:1;
	int sq=ceil(sqrt(mod));
	mp.clear();
	for(int i=0,pw=1;i<=sq;i++,pw=pw*x%mod)
		mp[pw*c%mod]=i;
	x=ksm(x,sq);
	for(int i=1,nw=x;i<=sq;i++,nw=nw*x%mod)
		if(mp.find(nw)!=mp.end())return i*sq-mp[nw];
	return -1;
}

exBSGS

inline int exBSGS(int a,int b){
	a%=mod;b%=mod;
	if(b==1)return 0;
	if(!a)return b?-1:1;
	int num=0,k=1,sq=ceil(sqrt(mod)),d;//
	while(1){
		d=gcd(a,mod);
		if(d==1)break;
		if(b%d)return -1;
		b/=d;mod/=d;num++;
		k=k*a/d%mod;//
		if(k==b)return num;
	}
	mp.clear();
	for(int i=0,x=b;i<=sq;i++,x=x*a%mod)//
		mp[x%mod]=i;
	a=ksm(a,sq);
	for(int i=1,nw=k*a%mod;i<=sq;i++,nw=nw*a%mod)
		if(mp.find(nw)!=mp.end())return i*sq-mp[nw]+num;
	return -1;
}

CRT

\[ans=\sum_{i=1}^ka_iM_it_i(M_i=\frac M{m_i},M_it_i≡1\pmod{m_i}) \]

exCRT

A=a[1];M=m[1];
for(int i=2,d,x,y;i<=n;i++){
	d=exgcd(M,m[i],x,y);
	x=mul((x%m[i]+m[i])%m[i],(a[i]-A)/d,m[i]/d);
	A=(x*M+A);
	M=M/d*m[i];
	A%=M;
}
cout<<A<<"\n";

Lucas

\[C_n^m\mod p=C_{n/p}^{m/p}*C_{n\mod p}^{m\mod p}\mod p,pIsPrime \]

exLucas

把模數拆成互質的幾個部分\(p^c\)然後用中國剩餘定理求解,注意算階乘分別處理兩部分,含有\(p\)和不含的(不用Lucas了)

牛頓迭代

給定多項式\(g(x)\),已知有\(f(x)\)滿足:

\[g(f(x))\equiv0 \pmod {x^n} \]

求模\(x^n\)意義下的\(f(x)\)

倍增

\(n=1\)時,\([x^0]g(f(x))=0\)的解單獨算

已知\(f_0(x)\)\(x^\frac n2\)的解,求模\(x^n\)的解\(f(x)\)

\(g(f(x))\)\(f_0(x)\)處泰勒展開

\[\sum_{i=0}^{oo}\frac{g^{(i)}(f_0(x))}{i!}(f(x)-f_0(x))^i\equiv0\pmod {x^n} \]

\(f(x)-f_0(x)\)的最低非零項次數為\(\frac n2\),有

\[(f(x)-f_0(x))^i\equiv …… \]

……

\[f(x)=f_0(x)-\frac{g(f_0(x))}{g`(f_0(x))}\pmod{x^n} \]

例:多項式\(exp\)

給定函式為\(h(x)\)

\(g(f(x))=\ln f(x)-h(x)\pmod {x^n}\)

\[f(x)\equiv f_0(x)-\frac{\ln f_0(x)-h(x)}{\frac 1{f_0(x)}}\pmod{x^n} \]

\[f(x)\equiv f_0(x)(1-\ln f_0(x)+h(x))\pmod{x^n} \]

時間複雜度

\[T(n)=T(\frac n2)+O(n\log n)=O(n\log n) \]

poly ln exp

關鍵詞:麥克勞林級數

\[\ln(1-f(x))=-\sum_{i=1}^{oo}\frac{f^i(x)}i \]

\[\ln(1+f(x))=\sum_{i=1}^{oo}\frac{(-1)^{i-1}f^i(x)}i \]

\[\exp f(x)=e^{f(x)}=\sum_{i=0}^{oo}\frac{f^i(x)}{i!} \]

Pollard-Rho

inline bool MR(int n,int p){
	int k=n-1,nw;
	while(k){
		nw=ksm(p,k,n);
		if(nw!=1&&nw!=n-1)return 0;
		if((k&1)||nw==n-1)return 1;
		k>>=1;
	}
	return 1;
}
inline bool prime(int n){
	if(n<2||n==46856248255981ll)return 0;
	if(n==2||n==3||n==7||n==61||n==24251)return 1;
	return MR(n,2)&&MR(n,61);
}
inline int f(int x,int c,int mod){
	return (mul(x,x,mod)+c)%mod;
}
inline int PR(int n){
	int t=0,c=rand()%n,s,sum,d;
	for(int w=1;;w<<=1){
		s=t;sum=1;
		for(int i=0;i<w;i++){
			t=f(t,c,n);
			sum=mul(sum,abs(t-s),n);
			if(i%127==0){
				d=gcd(n,sum);
				if(d>1)return d;
			}
		}
		d=gcd(n,sum);
		if(d>1)return d;
	}
}

快速乘

inline ll mul(ul x,ul y,ul mod){
	return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;
}