约数

这篇博客介绍了约数的基本概念,包括约数的计数与求和公式,以及试除法和倍数法求解正约数集合。此外,还详细讲解了最大公约数的欧几里得算法,以及互质与欧拉函数的定义、性质和应用。通过例题展示了如何实际应用这些理论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算数基本定理的推论

N的正约数集合:
{ p 1 b 1 p_1^{b1} p1b1 p 2 b 2 p_2^{b2} p2b2 p m b m p_m^{bm} pmbm},其中0<=bi<=ci
N的正约术个数为:
( c 1 + 1 ) ∗ ( c 2 + 1 ) ∗ . . . ∗ ( c m + 1 ) = ∏ i = 1 m ( c i + 1 ) (c_1+1)*(c_2+1)*...*(c_m+1) = \prod_{i=1}^{m}(c_i+1) (c1+1)(c2+1)...(cm+1)=i=1m(ci+1)
N的所有正约数的和为:
( 1 + p 1 + p 1 2 + . . . + p 1 c 1 ) ∗ . . . ∗ ( 1 + p m + p m 2 + . . . p m c m ) = ∏ i = 1 m ( ∑ j = 0 c i ( p i ) j ) (1+p_1+p_1^2+...+p_1^{c_1})*...*(1+p_m+p_m^2+...p_m^{c_m}) = \prod_{i=1}^{m}(\sum_{j=0}^{c_i}(p_i)^j) (1+p1+p12+...+p1c1)...(1+pm+pm2+...pmcm)=i=1m(j=0ci(pi)j)

求N的正约数集合

试除法

int factor[1600], m = 0;
void func(int n) {
	for (int i = 1; i * i <= n; i++) {
		if (n % i == 0) {
			factor[++m] = i;
			if (i != n / i)factor[++m] = n / i;
		}
	}
	for (int i = 1; i <= m; i++)
		cout << factor[i] << endl;
}

推论:
一个整数N的约数个数上界为2 N \sqrt{N} N

求1~N每个数的正约数集合

倍数法

vector<int>factor[500010];
void func(int n) {
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n / i; j++)
            factor[i * j].push_back(i);
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < factor[i].size(); j++)
            cout << factor[i][j] << " ";
        cout << endl;
    }
}

例题

AcWing198
AcWing199

最大公约数

欧几里得算法

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

互质与欧拉函数

互质的定义:

gcd(a,b)=1,a与b互质

欧拉函数

φ ( N ) = N ∗ p 1 − 1 p 1 ∗ p 2 − 1 p 2 ∗ . . . ∗ p m − 1 p m = N ∗ ∏ 质 数 p ∣ N ( 1 − 1 p ) \varphi{(N)} = N*\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}*...*\frac{p_m-1}{p_m} = N*\prod_{质数p|N}(1-\frac{1}{p}) φ(N)=Np1p11p2p21...pmpm1=NpN(1p1)

int phi(int n) {
    int ans = n;
    for (int i = 2; i <= sqrt(n); 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;
}

性质1~2

1. ∀ \forall n>1,1~n中与n互质的数的和为n* φ ( n ) \varphi(n) φ(n)/2。
2.若a,b互质,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)

积性函数

如果当a,b互质时,有f(a,b)=f(a)*f(b),那么f为积性函数

性质3~6

3.若f是积性函数,且在算术基本定理中 f ( n ) = ∏ i = 1 m p i c i f(n)=\prod_{i=1}^{m}p_i^{c_i} f(n)=i=1mpici
4.设p为质数,若p|n且 p 2 ∣ n p^2|n p2n,则 φ ( n ) = φ ( n / p ) ∗ p \varphi(n)=\varphi(n/p)*p φ(n)=φ(n/p)p
5.设p为质数,若p|n且 p 2 ∤ n p^2\nmid n p2n,则 φ ( n ) = φ ( n / p ) ∗ ( p − 1 ) \varphi(n)=\varphi(n/p)*(p-1) φ(n)=φ(n/p)(p1)
6. ∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n

例题:

AcWing201
可见的点

void euler(int n) {
    for (int i = 2; i <= n; i++) phi[i] = i;
    for (int i = 2; i <= n; i++)
        if (phi[i] == i)
            for (int j = i; j <= n; j += i)
                phi[i] = phi[i] / i * (i - 1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值