省選數學複習
複數運算
\((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;
}