1、模运算的性质:
- 加法:
- 乘法:
- 减法:
2、快速幂:
因为\(a^b\)可以看做成\(a^{b_{(2)}}\)(其中的\(x_{(2)}\)表示某数的二进制形式)
所以\(a^b\)可以表达成\(a^{2^i}\),证明如下:
根据此性质加以位运算可以快速得出幂的大小。
long long fastfac(long long a,long long b){
long long ans = 1;
while(b>0){
if(b&1)
ans = ans * a;
b >>= 1;
a = a * a;
}
return ans;
}
3、欧拉函数φ:
- 作用:求得小于n的正整数中与n互质的数的数目;
- 公式:
- 证明:
整理算式,可知:
\[\phi(n)=\prod_{p|n}p^{a}\prod_{p|n}(1-\frac{1}{p}) \]\[\because n = \prod_{p|n}p^{a} \]\[\therefore \phi(n)=n*\prod_{p|n}(1-\frac{1}{p}) \]- 性质:
- 当\(p\)为质数时,\(\phi(p)=p-1\)
- 当\(p\)为质数时,\(\phi(p^k)=p^{k-1}(p-1)=p^{k}(1-\frac{1}{p})=p^k(\frac{p-1}{p})\)
- 当\(m\)、\(n\)互质时,\(\phi\)为积性函数,即\(\phi(mn)=\phi(m)\times\phi(n)\)
- 设\(p\)为质数,若\(p|n\)且\(p^2|n\),则有\(\phi(n)=\phi(\frac{n}{p})\times p\)
- 设\(p\)为质数,若\(p|n\)且\(p^2\)不是\(n\)因子,则有\(\phi(n)=\phi(\frac{n}{p})\times(p-1)\)
- \(\forall n\in N,n\,=\,\sum_{d|n}\phi(d)\)
- \(\forall n > 1,1\sim n\)中与n互质的数的和为\(\frac{n\times \phi(n)}{2}\)
- 实现:一般用欧拉筛来实现φ
int phi(int num) {
int fin = sqrt(num);
int ans = num;
for (int i = 2; i <= fin; i++) {
if (num % i == 0) {
ans /= i;
ans *= (i - 1);
}
while (num % i == 0)
num /= i;
}
if (num > 1) {
ans /= num;
ans *= (num - 1);
}
return ans;
}
4、\(gcd(a,b)\)和\(lcm(a,b)\):
- \(gcd(a,b)\):
- 作用:求得\(a\),\(b\)的所有公因数中最大的一个
- 性质:
- \(gcd(a,b)=gcd(b,a)\)
- \(gcd(a,b)=gcd(-a,b)\)
- \(gcd(a,b)=gcd(|a|,|b|)\)
- 若有\(d|a\)且\(d|b\),则\(d|gcd(a,b)\)
- \(gcd(a,0)=a\)
- \(gcd(a,ka)=a\)
- \(gcd(an,bn)=n\, gcd(a,b)\)
- \(gcd(a,b)=gcd(a,ka+b)\)
- 实现:辗转相除法(欧几里得算法)
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
- \(lcm(a,b)\):
- 作用:求得\(a\),\(b\)的所有公倍数中最小的一个
- 性质:
- $gcd(a,b) * lcm(a,b) = a * b $
- 若有\(a|m\)且\(b|m\),则\(lcm(a,b)|m\)
- 若\(m,a,b\)是正整数,则\(lcm(ma,mb) = m\times lcm(a,b)\)。
- 求\(n\)个数的最小公倍数\((n>2)\):
long long lcm(const int a[], int n) {
long long ans = 1;
for (int i = 1; i <= n; i++)
ans = ans * a[i] / gcd(ans, a[i]);
return ans;
}
5、互质:
- 定义:\(\forall a,b \in N\),若\(gcd(a,b)=1\),则称\(a,b\)互质,若\(n\)个整数的最大公因数是1,则称这\(n\)个整数两两互质。
- 推论:\(a,b\)互质\(\Longleftrightarrow gcd(a,b)=1\)。
- 性质:
- 两个不同的质数一定是互质数
- 一个质数,另一个不为它的倍数,这两个数为互质数。
- \(1\)既不是质数也不是合数,它和任意一个自然数(除去\(1\)本身外)在一起都是互质的。
- 相邻的两个自然数是互质的。
- 相邻的两个奇数是互质的。
- 较大数是质数的两个数是互质的。