数论
最大公因数
-
直接使用
__gcd(x,y)
-
手写 \(\gcd\)
inline int gcd(int a,int b) { if(b==0)return a; return gcd(b,a%b); }
数论分块
一般是求
考虑 \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 的值可能会重复,所以可以算出 \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 每一段相同的值以及其区间。
接下来考虑如何求出 \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 每一段相同的值以及其区间。
方法就是用
while (l <= n) {
r = n / (n / l); // 计算当前块的右端点
l = r + 1; // 左端点移到下一段
}
r=l+1
很好理解,主要是看r=n/(n/l)
在括号里的n/l
其实是指当前这一段 \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 的值。
将n/l
在套一个n/
是指 \(\left\lfloor\dfrac{n}{i}\right\rfloor=n/l\) 中最大的 \(i\)
费马小定理
若 \(p\) 为素数,\(\gcd(a,p)=1\),则 \(a^{p-1}\equiv1\) \((mod\) \(p)\).
引理
-
引理1:若 \(a,b,c\) 为任意 \(3\) 个整数,\(m\) 为正整数,且 \(\gcd(m,c)=1\),
则当 \(a*c\equiv b*c\) \((mop\) \(m)\) 时,有 \(a\equiv b\) \((mod\) \(m)\).
证明:
\(a*c\equiv b*c\) \((mod\) \(m)\) 可得 \(ac-bc\equiv 0\) $(mod $ \(m)\) ,即 \((a-b)c\equiv 0\) $(mod $ \(m)\).
因为 \(\gcd(m,c)=1\) 即 \(m,c\) 互质,\(c\) 可以约去,\(a-b\equiv 0\) $(mod $ \(m)\),\(a\equiv b\) $(mod $ \(m)\).
-
引理2:设 \(m\) 是一个整数且 \(m>1\),\(b\) 是一个整数且 \(\gcd(m,b)=1\)。如果 \(a[1],a[2],a[3],a[4],…a[m]\) 是模 \(m\) 的一个完全剩余系,则 \(b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]\) 也构成模 \(m\) 的一个完全剩余系。
证明:若存在2个整数 \(b·a[i]\) 和 \(b·a[j]\) 同余即 \(b·a[i]\equiv b·a[j](mod\) \(m)(i>=1,j>=1)\),根据引理1则有 \(a[i]≡a[j](mod\) \(m)\)。根据完全剩余系的定义可知这是不可能的,因此不存在 \(2\) 个整数 \(b·a[i]\) 和 \(b·a[j]\) 同余。
所以 \(b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]\) 也构成模 \(m\) 的一个完全剩余系。
证明:
设一个质数为 \(p\),我们取一个不为 \(p\) 倍数的数 \(a\).
构造素数 \(p\) 的完全剩余系:\(P={1,2,3,\dots,p-1}\)
因为 \(\gcd(a,p)=1\),有引理2得:\(A={a,2a,3a,4a,\dots,(p-1)a}\) 也是一个完全剩余系,由完全剩余系的性质,
得 \(1\times2\times3\times\dots\times(p-1)\equiv a\cdot 2a\cdot \dots\cdot (p-1)a\) \((mod\) \(p)\).
即 \((p-1)!\equiv (p-1)!\cdot a^{p-1}\) $(mod $ \(p)\).
易证:\(\gcd((p-1)!,p)=1\) ,根据引理1,约去 \((p-1)!\) ,得到
由此费马小定理得证.