省选数学复习

复数运算

((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≡1pmod{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<<"
";

Lucas

[C_n^mmod p=C_{n/p}^{m/p}*C_{nmod p}^{mmod 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))^iequiv0pmod {x^n} ]

(f(x)-f_0(x))的最低非零项次数为(frac n2),有

[(f(x)-f_0(x))^iequiv …… ]

……

[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(nlog n)=O(nlog 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!} ]

Miller-Rabin

int pri[12]={2,3,5,7,11,13,17,19,23,29,31,37};
inline bool MR(int n){
	for(int i=0;i<12;i++)
		if(pri[i]==n)return 1;
	if(n<2||!(n&1))return 0;
	for(int i=0,k,x;i<12;i++){
		k=n-1;
		while(k){
			x=ksm(pri[i],k,n);
			if(x!=1&&x!=n-1)return 0;
			if((k&1)||x==n-1)break;
			k>>=1;
		} 
	}
	return 1;
}

Pollard-Rho

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 int mul(ul x,ul y,ul mod){
	return (x*y-(int)((long double)x/mod*y)*mod+mod)%mod;	
}
原文地址:https://www.cnblogs.com/aurora2004/p/13206498.html