之前开的[数论提高题选做]大概已经咕掉了(
因为完全来不及了啊qwq)
考前两天赶紧复习一下我最辣鸡的数学。
这篇博客是给自己复习用的,如果你要学习的话,可以参考一下这位大佬的博客。
费马小定理: p p p为素数, g c d ( p , a ) = 1 gcd(p,a)=1 gcd(p,a)=1,有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}≡1(\bmod \ p) ap−1≡1(mod p)。
欧拉定理: g c d ( p , a ) = 1 gcd(p,a)=1 gcd(p,a)=1,有 a φ ( p ) ≡ 1 ( m o d p ) a^{φ(p)}≡1(\bmod \ p) aφ(p)≡1(mod p)。
ex欧拉定理:
(懒得打公式了)
没什么好说的 a − 1 ≡ 0 ( m o d p ) a^{-1}≡0(\bmod \ p) a−1≡0(mod p),根据费马小定理,得到 a − 1 ≡ a p − 2 ≡ 0 ( m o d p ) a^{-1}≡a^{p-2}≡0(\bmod \ p) a−1≡ap−2≡0(mod p)。
直接写快速幂就好了。
这东西是构造出来的。
考虑 p = k x + t p=kx+t p=kx+t,显然有 k x + t ≡ 0 ( m o d p ) kx+t≡0(\bmod \ p) kx+t≡0(mod p),移项 − k × t − 1 ≡ x − 1 ( m o d p ) -k\times t^{-1}≡x^{-1}(\bmod \ p) −k×t−1≡x−1(mod p)。
k k k就是 ⌊ p x ⌋ \lfloor \frac{p}{x} \rfloor ⌊xp⌋, t t t就是 p m o d x p \bmod x pmodx。
设 x x x的逆元为 i n v x inv_x invx。
因此 i n v x ≡ − ⌊ p x ⌋ × i n v p m o d x ( m o d p ) inv_x≡-\lfloor \frac{p}{x} \rfloor \times inv_{p \bmod x}(\bmod \ p) invx≡−⌊xp⌋×invpmodx(mod p)
因为负数,通常写作:
i n v x ≡ ( p − ⌊ p x ⌋ ) × i n v p m o d x ( m o d p ) inv_x≡(p-\lfloor \frac{p}{x} \rfloor) \times inv_{p \bmod x}(\bmod \ p) invx≡(p−⌊xp⌋)×invpmodx(mod p)
f ( x ) f(x) f(x)是积性函数,则有 f ( a b ) = f ( a ) × f ( b ) f(ab)=f(a)\times f(b) f(ab)=f(a)×f(b), g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1。
众所周知, φ ( x ) φ(x) φ(x)(欧拉函数), σ ( x ) σ(x) σ(x)(因数和函数), D ( x ) D(x) D(x)(因数个数函数), μ ( x ) \mu(x) μ(x)(莫比乌斯函数)都是积性函数。
一般思路是将 f ( x ) f(x) f(x)变为 f ( p 1 k 1 ) × f ( p 2 k 2 ) × . . . × f ( p n k n ) f(p_1^{k_1})\times f(p_2^{k_2})\times ...\times f(p_n^{k_n}) f(p1k1)×f(p2k2)×...×f(pnkn)。
然后用相应的方法处理。
下面是一些例子:
φ ( x ) = φ ( p 1 k 1 ) × φ ( p 2 k 2 ) × . . . × φ ( p n k n ) φ(x)=φ(p_1^{k_1})\times φ(p_2^{k_2})\times ...\times φ(p_n^{k_n}) φ(x)=φ(p1k1)×φ(p2k2)×...×φ(pnkn)。
定理: φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) φ(p^k)=p^k-p^{k-1}=p^{k-1}(p-1) φ(pk)=pk−pk−1=pk−1(p−1), p p p为质数。
化简一下就是: φ ( x ) = n × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) × . . . × ( 1 − 1 p n ) φ(x)=n\times (1-\frac{1}{p_1})\times (1-\frac{1}{p_2})\times ...\times (1-\frac{1}{p_n}) φ(x)=n×(1−p11)×(1−p21)×...×(1−pn1)。
应该是小学奥数内容:)
D ( x ) = ( k 1 + 1 ) × ( k 2 + 1 ) × . . . × ( k n + 1 ) D(x)=(k_1+1)\times (k_2+1)\times ...\times (k_n+1) D(x)=(k1+1)×(k2+1)×...×(kn+1)。
σ ( p k ) = 1 + p 1 + p 2 + . . . + p k = p k + 1 − 1 p − 1 σ(p^k)=1+p^1+p^2+...+p^k=\frac{p^{k+1}-1}{p-1} σ(pk)=1+p1+p2+...+pk=p−1pk+1−1。
因此 σ ( x ) = p 1 k 1 + 1 − 1 p 1 − 1 × p 1 k 1 + 1 − 1 p 1 − 1 × . . . × p n k n + 1 − 1 p n − 1 σ(x)=\frac{p_1^{k_1+1}-1}{p_1-1}\times \frac{p_1^{k_1+1}-1}{p_1-1} \times ...\times \frac{p_n^{k_n+1}-1}{p_n-1} σ(x)=p1−1p1k1+1−1×p1−1p1k1+1−1×...×pn−1pnkn+1−1。
可以试试用dp计算
例题:CF757E Bash Plays with Functions。
其实跟单个差不多,只是在做线性筛的时候按公式递推一下。
处理 D ( x ) D(x) D(x)示例:
void Prime_S(){
memset(SPrime,1,sizeof(SPrime));
SPrime[1]=0;
D[1]=1;
for(int i=2;i<=2000000;i++){
if(SPrime[i])
{
Prime[++Pnum]=i;D[i]=2;}
for(int j=1;i*Prime[j]<=2000000;j++)
if(i%Prime[j]==0){
int q=i,co=1;
while(q%Prime[j]==0){
q/=Prime[j];
co++;
}
SPrime[i*Prime[j]]=0;
D[i*Prime[j]]=D[q]*(co+1);
break;
}
else{
SPrime[i*Prime[j]]=0;
D[i*Prime[j]]=D[i]*D[Prime[j]];
}
}
}
如果不是线性的话当然就更好写了…(不过上面那个好像也不是线性的)
普通gcd是这样的:
LL gcd(LL a,LL b){
return b?gcd(b,a%b):a;
}
打CF的时候肯定__gcd
最好了
现在我们要用这东西解方程 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)。
对于 a = k b + t a=kb+t a=kb+t,如果我们有了 b x + t y = gcd ( a , b ) bx+ty=\gcd(a,b) bx+ty=gcd(a,b)的一组解 ( x ′ , y ′ ) (x',y') (x′,y′),那么 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)的解就是 ( y ′ , x ′ − k y ′ ) (y',x'-ky') (y′,x′−ky′)。
其实我们只需要将 t t t带入就得出来了。
t = a − k b t=a-kb t=a−kb, b x ′ + ( a − k b ) y ′ = gcd ( a , b ) bx'+(a-kb)y'=\gcd(a,b) bx′+(a−kb)y′=gcd(a,b), a y ′ + b ( x ′ − k y ′ ) = gcd ( a , b ) ay'+b(x'-ky')=\gcd(a,b) ay′+b(x′−ky′)=gcd(a,b)。
然后考虑一下边界情况 b = 0 b=0 b=0。
这时候 a × x + 0 × y = gcd ( a , b ) = a a\times x+0\times y=\gcd(a,b)=a a×x+0×y=gcd(a,b)=a,显然有一组解 x = 1 , y = 0 x=1,y=0 x=1,y=0。
这里的 k , t k,t k,t的含义其实就是 ⌊ a b ⌋ , a m o d b \lfloor \frac{a}{b} \rfloor,a\bmod b ⌊ba⌋,amodb。
这种做法还可以扩展到很多东西上面(比如二维欧几里得,多项式等等),具体可以去看集训队论文。
LL exgcd(LL a,LL b,LL &x,LL &y){
LL x0,y0,G;
if(!b){
x=1,y=0;return a;}
G=exgcd(b,a%b,x0,y0);
x=y0,y=x0-(a/b)*y0;
return G;
}
当然一般情况下我们要求 a x + b y = c ax+by=c ax+by=c的 x x x最小整数解。
首先根据裴蜀定理,设 g = gcd ( a , b ) g=\gcd(a,b) g=gcd(a,b),方程有解当且仅当 c ≡ 0 ( m o d g ) c≡0(\bmod \ g) c≡0(mod g)。
因此我们先求出 a x + b y = g ax+by=g ax+by=g的解,再将 x , y x,y x,y乘上 c g \frac{c}{g} gc。
我们这样就找到了一个特解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)。
如果我们要要求最小整数解的话。
我们可以运用结论,得到
{ x = x 0 + t × b g , y = y 0 − t × a g , t ∈ Z } \{x=x_0+t\times \frac{b}{g},y=y_0-t\times \frac{a}{g},t\in \Z\} { x=x0+t×gb,y=y0−t×ga,t∈Z}
因此最小正整数解为 ( x 0 + b g ) m o d b g (x_0+\frac{b}{g})\bmod \frac{b}{g} (x0+gb)modgb(感性理解一下)。
解方程
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) . . . x ≡ a n ( m o d m n ) \begin{cases} x≡a_1(\bmod \ m_1) \\ x≡a_2(\bmod \ m_2) \\ ...\\ x≡a_n(\bmod \ m_n) \\ \end{cases}\\ ⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1(mod m1)x≡a2(mod m2)...x≡an(mod mn)
对于 m 1 , m 2 , m 3 , . . . , m n m_1,m_2,m_3,...,m_n m1,m2,m3,...,mn两两互质的情况,我们可以尝试构造一个特解。
构造方法是:
M = ∏ i = 1 n m i M=\prod^n_{i=1}m_i M=∏i=1nmi, t i t_i ti满足 t i × M m i ≡ 0 ( m o d m i ) t_i\times \frac{M}{m_i}≡0(\bmod \ m_i) ti×miM≡0(mod mi)。
那么特解是: x 0 = ∑ i = 1 n a i × t i × M m i x_0=\sum^n_{i=1}a_i\times t_i \times \frac{M}{m_i} x0=∑i=1nai×ti×miM。
容易发现循环节为 M M M(因为两两互质),因此通解为:
x = x 0 + k × M x=x_0+k\times M x=x0+k×M
求解 t i t_i ti时我们需要exgcd。
在扩展定理中, m i m_i mi就不互质了。
我们考虑从前往后将方程一个一个合并。
因此我们设 M = l c m ( m 1 , m 2 , . . . , m k − 1 ) M=lcm(m_1,m_2,...,m_{k-1}) M=lcm(m1,m2,...,mk−1)。
对于方程组:( a 0 a_0 a0是前面方程组的特解)
{ x ≡ a 0 ( m o d M ) x ≡ a k ( m o d m k ) \begin{cases} x≡a_0(\bmod \ M) \\ x≡a_k(\bmod \ m_k) \\ \end{cases}\\ { x≡a0(mod M)x≡ak(mod mk)
转为不定形式:
{ x = M × p + a 0 x = m k × q + a k \begin{cases} x=M\times p+a_0 \\ x=m_k\times q +a_k\\ \end{cases}\\ { x=M×p+a0x=mk×q+ak
然后 M × p + a 0 = m k × q + a k M\times p+a_0=m_k\times q +a_k M×p+a0=mk×q+ak, M × p − m k × q = a 0 − a k M\times p-m_k\times q=a_0-a_k M×p−mk×q=a0−ak
这就是一个不定方程求解的问题了。
设 g = gcd ( M , m k ) g=\gcd(M,m_k) g=gcd(M,mk), a 0 − a k ≡ 0 ( m o d g ) a_0-a_k≡0(\bmod \ g) a0−ak≡0(mod g)时才有解。
然后我们就得到了 p 0 p_0 p0,然后转为最小非负整数解。
这样就有了新的解 x = M × p + a 0 x=M\times p+a_0 x=M×p+a0。
大概不会考,暂时咕掉。
1. a x + b y ( x ≥ 0 , y ≥ 0 ) ax+by(x≥0,y≥0) ax+by(x≥0,y≥0)最大不能表示的数为 a ∗ b − a − b a*b-a-b a∗b−a−b。
具体证明可以用构造法:
[转载自:Luogu Mzwuzad大佬的题解]
2. { 0 , t , 2 t , 3 t , . . . , ( n − 1 ) t } \{ 0,t,2t,3t,...,(n-1)t \} { 0,t,2t,3t,...,(n−1)t}在 m o d n \bmod \ n mod n意义下是完系的充要条件是 g c d ( t , n ) = 1 gcd(t,n)=1 gcd(t,n)=1。
如有错误,请评论纠正。