数论 易
整除
对于两个整数 \(a\ ,\ b\) ,若 \(\exists k\in Z\) 使 \(ak=b\) 则称 \(a\) 整除 \(b\) ,记做 \(a|b\)
快速幂
好像没什么好讲的...讲下证明
对于求 \(x^y\) ,将 \(y\) 表示为二进制,如: \(105_{(10)}=1101001_{(2)}\)
所以 \(x^y=x^{2^6+2^5+2^3+2^0}=x^{2^6}x^{2^5}x^{2^3}x^{2^0}\)
x | ans |
---|---|
\(x\) | \(x^{2^0}\) |
\(x^2\) | \(x^{2^0}\) |
\(x^4\) | \(x^{2^0}\) |
\(x^8\) | \(x^{2^3}x^{2^0}\) |
\(x^{16}\) | \(x^{2^3}x^{2^0}\) |
\(x^{32}\) | \(x^{2^5}x^{2^3}x^{2^0}\) |
\(x^{32}\) | \(x^{2^6}x^{2^5}x^{2^3}x^{2^0}\) |
\(\mathcal{Code}:\)
#define int long long
int ksm(int a,int b,int mod){
int ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans%mod;
}
例题:P1226 快速幂
gcd
对于两个数 \(a\) , \(b\) 的最大公约数
裴蜀定理
对于任意 \(x\ , \ y\) 都 \(\exists \ a,b\) 满足 \(ax+by=gcd(x,y)\)
证明:就算百度百科你们都能看懂
应用
用来做题
可以用来证明奇奇怪怪的东西和推式子
信息上对于这东西常见的套路是枚举\(gcd\)
如:给你T组数据,求 \(\displaystyle\sum_{i=1}^n \sum_{j=1}^m gcd(i,j)\)
其中有一步是标准的枚举 \(gcd\)
\(\displaystyle{\begin{aligned}&\sum_{i=1}^n \sum_{j=1}^m gcd(i,j)\\=&\sum_{i=1}^n \sum_{j=1}^m \sum_{d|i,j}d[gcd(\frac id,\frac jd)==1]\end{aligned}}\)
\(\mathcal{Code}:\)
//__gcd(x,y)
//emmming...
inline void gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
例题(注意卡常):UVA11426 GCD - Extreme (II)
exgcd
定义
一种算法
首先根据裴蜀定理,对于等式 \(ax+by=gcd(a,b)\) 一定存在整数解
\(EXgcd\) 就是求该等式的一组特解
求法
推柿子~
\(\left\{ \begin{array}{lrc} ax+by=gcd(a,b)\\ bx'+(a\%b)y'=gcd(b,a\%b)\\a\%b=a-b*\lfloor\frac ab\rfloor\\gcd(a,b)=gcd(b,a\%b) \end{array} \right.\Rightarrow\left\{\begin{array}{lrc} x=y'\\y=x'-y'\lfloor\frac ab\rfloor \end{array} \right.\)
之后令\(g=gcd(a,b)\)
则 \(lcm(a,b)=a*b/g\)
又 \(ax+lcm(a,b)+by-lcm(a,b)=c\)
故有 \(a(x+b/g)+b(y-a/g)=c\)
由此可得,\(x\) 加上或减去任意倍数的 \(b/gcd(a,b)\) 后均有对应的y的解
令 \(t=b/g\), \((x\%t+t)\%t\) 就是x的最小非负解
\(\mathcal{Code:}\)
inline void exgcd(int a,int b,int &x,int &y){
if(!b){
x=1;y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
\(lcm\)
这个真没什么好说的
\(lcm\) 这东西在数论推柿子里因没有什么性质而遭到嫌弃
通常把 \(lcm\) 转化为 \(gcd\) 来做: \(lcm(i,j)=\frac {i*j}{gcd(i,j)}\)
注意,这一条性质只在两个数时才成立,其他情况不一定,比如
\(\frac {1*2*3*4*5}{gcd(1,2,3,4,5)} = 1*2*3*4*5 \neq lcm(1,2,3,4,5)\)
例题: P1891 疯狂LCM
同余
对于两整数 \(a\ ,\ b\) 若 \(a\mod p=b\mod p\) 则称 \(a\) 与 \(b\) 在模 \(p\) 意义下同余
用符号表示则为 \(a \equiv b \pmod p\)
性质
对称性:\(a\equiv b\pmod p\Rightarrow b\equiv a\pmod p\)
可乘性:若 \(a\equiv b\pmod p,c\equiv d\pmod p\) ,则 \(ac\equiv bd\pmod p\)
应用
对于信息比较基本,没有什么应用,主要用在定理的证明和表达中
对于同余式 \(ax \equiv b \pmod p\) ,可以转化为 \(ax+kp=b\) 就可以应用 exgcd 求了
特殊的,对于同余式 \(a \equiv 1 \pmod p\) 的一个解是 \(a\) 在模 \(p\) 意义下的逆元
例题: P1082 同余方程
逆元
对于整数\(a,p\),\(\exists \ a^{-1}\) 满足 \(a*a^{-1} \ \equiv \ 1(mod \ p)\) 则称 \(a^{-1}\) 是 \(a\) 在模 \(p\) 意义下的逆元
主要用于除法取模问题
因为除法不对模运算封闭,所以逆元应运而生
求逆元主要用两种方法,一是费马小定理,二是 exgcd,三是线性
只列出线性的代码
\(\mathcal{Code}:\)
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=((p-p/i)*inv[p%i])%p;
埃拉托色尼筛法
复杂度 $O(n loglogn) $
所以建议用欧拉筛 \(O(n)\)
在此讲一下原理
对于一个数 \(a\) , 则 \(k*a \ (k \in N^*)\) 一定不会在之后的循环中进入素数表,所以给他们打上标记
因为埃氏筛会对一些数重复筛,所以复杂度就不如欧拉筛优
\(\mathcal{Code}:\)
inline void pri(){
for(int i=2;i<=n;i++){
if(!ispri[i]) prime[++cnt]=i;
for(int j=1;j<=cnt;j++){
ispri[i*prime[j]]=1;
// if(!(i%prime[j])) break;
}
}
}
例题:P3383 线性筛素数(这题好像 \(\Theta (n^2)\) 都能过)
杜教筛
对于一个积性函数 \(f\),我们要求 \(\sum_{i=1}^n f(i)\)
\(\mathcal{Ans}\):
令 \(S(n)=\sum_{i=1}^n f(i)\),\(h=g*f\) (h,g为任意积性函数)
则 \(\displaystyle\sum_{i=1}^{n}(f*g)(i)\)
\(\displaystyle{\begin{aligned} &= \sum\limits_{i=1}^{n} \sum \limits _{d|i} g(d)f(\frac{i}{d}) \\ &= \sum \limits _{d=1}^{n} g(d)\sum\limits _{i=1}^{\lfloor \frac{n}{d}\rfloor } f(i) \\ &= \sum \limits _{d=1}^{n} g(d) S(\lfloor \frac{n}{d} \rfloor) \end{aligned}}\)
又 \(g(1)S(n)=\sum_{d=1}^ng(d)S(\lfloor\frac nd\rfloor)-\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)\)
则\(g(1)S(n)=\sum\limits_{i=1}^{n}(f*g)(i)-\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)\)
进行预处理&数论分块即可
例题:P4213 杜教筛
Lagrange 插值
孙子定理
若\(m_1,m_2,\cdots,m_n\)是两两互质的正整数,\(M=\prod_{i=1}^n{m_i}\),\(M_i=M/m_i\) , \(t_i\)是线性同余方程\(M_it_i\equiv 1 \ (mod \ m_i)\)的一个解
对于任意的n个整数\(a_1,a_2,\cdots,a_n\),则同余方程组: \(\begin{cases}x≡a_1(mod\ m_1)\\x≡a_2(mod\ m_2)\\ \cdots \cdots\\x≡a_n(mod\ m_n)\\\end{cases}\) 有整数解\(x=\displaystyle\sum_{i=1}^n M_it_i a_i\).并且在\(\mod M\) 意义下有唯一解。
证明
因为\(M_i=M/m_i\) 是除\(m_i\)之外所有模数的倍数,所以\(\forall \ k\not=i \ , \ M_it_ia_i\equiv 0 \ (mod \ m_k)\)
又因为\(M_it_ia_i\equiv a_i\ (mod \ m_i)\)
所以 \(x=\displaystyle\sum_{i=1}^n M_it_i a_i\)
结论
CRT给出了模数两两互质的线性同余方程组的一个特解。方程组的通解可以表示为 \(x+kM\ (k\in\mathbb Z)\)。有些题目要求我们求出最小的非负整数解,只需把 \(x\) 对 \(M\) 取模,并让x落在 \([1,M)\) 内即可。
正文
对于一个多项式 \(f(x)\),其图像在坐标系内经过 \(n\) 个点 \((x_i,y_i)\)
我们考虑对于此多项式的“孙子定理”:
构造 \(n\) 个多项式 \(g_i(n)\).对于第 \(i\) 个多项式,对于\(\forall k\not= i ,g_i(x_k)=0\),而 \(g_i(x_i)=1\),即 \(g_i(x_i)*y_i=y_i\)
则可得 \(g_i(x)=\dfrac{(x-x_1)(x-x_2)\cdots(x-x_{i-1})(x-x_{i+1})\cdots(x-x_n)}{(x_i-x_1)(x_i-x_2)\cdots(x_i-x_{i-1})(x_i-x_{i+1})\cdots(x_i-x_n)}\)
所以 \(f(x)=\displaystyle\sum_{i=1}^n g_i(x)*y_i\)
\(\mathcal{Code}\):
inline int Lagrange(){//求f(k)%998244353
int ans=0;
for(int i=1,res;i<=n;i++){
res=1;
// cout<<i<<":\n";
for(int j=1;j<=n;j++){
if(j==i) continue;
res=(res*((x[i]+mod-x[j])%mod))%mod;
}
res=ksm(res,mod-2);
for(int j=1;j<=n;j++){
if(j==i) continue;
res=(res*((k+mod-x[j])%mod))%mod;
}
res=res*y[i]%mod;
ans=(ans+res)%mod;
// cout<<ans<<"\n";
}
return ans;
}
例题:P4781 拉格朗日插值
莫比乌斯
积性函数
积性函数指:\(\forall a, b ∈ \mathbb N^+,gcd(a, b) = 1,s.t.f(ab)=f(a)f(b)\)
Dirichlet卷积
\((f*g)(n)=\displaystyle\sum_{d|n}f(d)g(\dfrac nd)\)
性质
- 交换律:\(f*g=g*f\)
- 结合律:\((f*g)*h=f*(g*h)\)
- 分配律:\(f*(g+h)=f*g+f*h\)
- 单位元:\(f*\epsilon=f\)
- 若\(f,g\) 为积性函数,那么 \(f*g\) 也是积性函数。
莫比乌斯等式
\(\epsilon(n)=\displaystyle\sum_{d|n}\mu(d)\)
例题
\(\displaystyle\sum_{i=1}^n\sum_{j=1}^m\sum_{d|i,j} \dfrac{ij}{gcd(\frac id,\frac jd)}\)