约数
d能整除n,则称d是n的约数
算术基本定理的两个推论
由算术基本定理:任何一个大于1的正整数都能唯一分解成有限个质数的乘积,可写作:N=p1c1p2c2⋯pmcm
其中ci都是正整数,pi都是质数,且p1<p2<⋯<pm
可以知道N的每个正约数都可以写成p1b1p2b2⋯pmbm,其中0≤bi≤ci
再由乘法原理可知,N的正约数个数为(c1+1)(c2+1)⋯(cm+1)
N的所有正约数之和为(1+p1+p21+⋯pc11)⋯(1+pm+p2m+⋯pcmm)
求N的正约数集合
试除法
由于约数总是成对出现(除了对于完全平方数,√N会单独出现),只需扫描1~√N,看是否能整除N即可
void getfactor(int n)
{
m = 0;
for (int i = 1; i <= n / i; i++)
{
if (n % i == 0)
{
factor[++m] = i;
if (i != n / i)
factor[++m] = n / i;
}
}
}
试除法推论
一个整数N的约数个数上界为2√N
求1~N每个数的正约数集合
倍数法
对于每个数d,1到N中以d为约数的数就是d的倍数
vector<int> factor[N]; // factor[i]里存i的正约数集合
void getfactor(int n)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n / i; j++)
factor[i * j].push_back(i);
}
倍数法推论
1到N每个数的约数个数的总和大约为NlogN
相关题有: 反素数 余数之和
最大公约数
定理: gcd(a,b)×lcm(a,b)=a×b
九章算术.更相减损术:∀a,b∈N,a≥b,有gcd(a,b)=gcd(a,a−b)=gcd(b,a−b)
欧几里得算法:∀a,b∈N,b≠0,gcd(a,b)=gcd(b,a%b)
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
由于高精度取模不容易实现,需要用高精度运算时,一般用更相减损术代替欧几里得算法
相关题有: Hankson的趣味题
互质与欧拉函数
若gcd(a,b)=1,则称a,b互质
若gcd(a,b,c)=1,则称a,b,c互质
若gcd(a,b)=gcd(a,c)=gcd(b,c)=1,则称a,b,c两两互质
欧拉函数:1到N中与N互质的数的个数被称为欧拉函数,记为φ(N)
若在算术基本定理中,:N=p1c1p2c2⋯pmcm,则:
φ(N)=N×p1−1p1×p2−1p2×⋯×pm−1pm
证明:利用容斥原理,得到1到N中不与N含有任何共同质因子的数的个数(就是与N互质的数的个数)
根据计算式,只需分解质因数就可以顺便求出一个数的欧拉函数
int phi(int n)
{
int ans = n;
for (int i = 2; i <= n / i; i++)
{
if (n % i == 0)
{
ans = ans / i * (i - 1);
while (n % i == 0)
n /= i;
}
}
if (n > 1)
ans = ans / n * (n - 1);
return ans;
}
利用线性筛O(N)求出2到N每个数的欧拉函数(利用下面提到的性质3和4)
int v[N], prime[N], phi[N], m;
void euler(int n)
{
for (int i = 2; i <= n; i++)
{
if (v[i] == 0)
{
v[i] = i, prime[++m] = i, phi[i] = i - 1;
}
for (int j = 1; j <= m; j++)
{
if (prime[j] > v[i] || prime[j] > n / i)
break;
v[i * prime[j]] = prime[j];
phi[i * prime[j]] = phi[i] * (i % prime[j] ? prime[j] - 1 : prime[j]);
}
}
}
欧拉函数的性质:
1.∀n>1,1~n中与n互质的数的和为n×φ(n)2
2.若a,b互质,则φ(ab)=φ(a)φ(b)
3.设p为质数,若p∣n且p2∣n,则φ(n)=φ(np)×p
4.设p为质数,若p∣n但p2∤,则\varphi (n)=\varphi(\frac{n}{p})\times (p-1)
5.\sum_{d\mid n}{\varphi (d)}=n
性质1证明:
根据更相减损术,gcd(n,x)=gcd(n,n-x),所以与n不互质的数是成对出现的,并且它们的平均值是\frac{n}{2},因此,与n互质的数的平均值也是\frac{n}{2}
性质2证明:
直接按欧拉函数计算式展开即可,等式两边是相等的
剩下三个证明有点难记,有需要见蓝书就好
相关题有: 可见的点
积性函数
若当a,b互质时,有f(ab)=f(a)\times f(b),那么称f为积性函数
性质:若f是积性函数,且在算术基本定理中N={p_1}^{c_1}{p_2}^{c_2}\cdots {p_m}^{c_m},则f(N)=f({p_1}^{c_1})f({p_2}^{c_2})\cdots f({p_m}^{c_m})
请问蓝书是什么?
李煜东的算法竞赛进阶指南(封面是蓝色)
好的,谢谢