参考:这里

前言

 这是笔者第一次写博客,挑选了一些笔者认为比较有意思且简单的欧拉函数的性质,希望各位看完的同时也自己动手证明一下,会对学习欧拉函数有很大的帮助。

一.定义

 在1~n中与n互质的数的个数,被称作欧拉函数,记作φ(n)

二.性质

1. 若 n 为 质 数 , 则 φ ( n ) = n − 1 证 明 : n 是 质 数 , 所 以 所 有 小 于 n 的 数 都 和 n 互 质 , 即 n − 1 1.若n为质数,则φ(n) = n - 1\\ 证明:\\ n是质数,所以所有小于n的数都和n互质,即n-1 1.若n为质数,则φ(n)=n−1证明:n是质数,所以所有小于n的数都和n互质,即n−1


2. 如 果 n 是 质 数 p 的 k 次 幂 , 即 n = p k , 则 φ ( n ) = p k − p k − 1 2. 如果n是质数p的k次幂,即n=p^k,则φ(n)=p^k-p^{k-1} 2.如果n是质数p的k次幂,即n=pk,则φ(n)=pk−pk−1
证 明 : 因 为 n = p k , 所 以 在 1 到 n 中 只 有 p 的 倍 数 与 n 不 互 质 , 可 以 分 为 p × 1 , p × 2...... p × p k − 1 , 一 共 有 p k − 1 个 数 与 n 互 质 , 则 φ ( n ) = n − p k − 1 = p k − p k − 1 。 证明:\\ 因为n=p^k,所以在 1到n中只有p的倍数与n不互质,\\ 可以分为p\times 1,p \times 2......p \times p^{k-1},\\一共有p^{k-1}个数与n互质,则φ(n)=n-p^{k-1}=p^k-p^{k-1}。 证明:因为n=pk,所以在1到n中只有p的倍数与n不互质,可以分为p×1,p×2......p×pk−1,一共有pk−1个数与n互质,则φ(n)=n−pk−1=pk−pk−1。


3. 欧 拉 函 数 计 算 公 式 φ ( n ) = n × ∏ p ∣ n ( 1 − 1 p ) 证 明 : 首 先 要 知 道 φ 是 积 性 函 数 , 即 对 于 互 质 的 p , q 都 有 φ ( p q ) = φ ( p ) φ ( q ) 首 先 n 可 以 分 为 n = p 1 a 1 p 2 1 2 . . . p m a m 因 为 φ 是 积 性 函 数 , 所 以 φ ( n ) = φ ( p 1 a 1 ) φ ( p 2 a 2 ) . . φ ( p m a m ) 由 性 质 2 转 化 这 个 等 式 = ( p a 1 − p a 1 − 1 ) ( p a 2 − p a 2 − 1 ) . . . ( p a m − p a m − 1 ) = ( p a 1 p a 2 . . . p a m ) ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p m ) = n × ∏ p ∣ n ( 1 − 1 p ) 3.欧拉函数计算公式\\ φ(n)=n \times \prod\limits_{p|n}(1 - {1 \over p})\\ 证明:\\ 首先要知道φ是积性函数,\\ 即对于互质的p,q都有φ(pq)=φ(p)φ(q) 首先n可以分为\\ n=p_1^{a_1}p_2^{1_2}...p_m^{a_m}\\ 因为φ是积性函数,所以\\ φ(n)=φ(p_1^{a_1})φ(p_2^{a_2})..φ(p_m^{a_m})\\ 由性质2转化这个等式\\ =(p^{a_1}-p^{a_1-1})(p^{a_2}-p^{a_2 -1})...(p^{a_m}-p^{a_{m-1}})\\ =(p^{a_1}p^{a_2}...p^{a_m})(1-{1 \over p_1})(1-{1 \over p_2})...(1-{1\over p_m})\\ =n\times \prod\limits_{p|n}(1-{1\over p}) 3.欧拉函数计算公式φ(n)=n×p∣n∏​(1−p1​)证明:首先要知道φ是积性函数,即对于互质的p,q都有φ(pq)=φ(p)φ(q)首先n可以分为n=p1a1​​p212​​...pmam​​因为φ是积性函数,所以φ(n)=φ(p1a1​​)φ(p2a2​​)..φ(pmam​​)由性质2转化这个等式=(pa1​−pa1​−1)(pa2​−pa2​−1)...(pam​−pam−1​)=(pa1​pa2​...pam​)(1−p1​1​)(1−p2​1​)...(1−pm​1​)=n×p∣n∏​(1−p1​)


4. 若 n > 2 , 则 φ ( n ) 为 偶 数 首 先 了 解 一 个 东 西 — — 更 相 减 损 术 即 g c d ( n , m ) = g c d ( n , n − m ) [ g c d ( a , b ) 表 示 a 和 b 的 最 大 公 约 数 ] 所 以 , 对 于 每 一 个 与 n 互 质 的 数 x ( 即 g c d ( n , x ) = 1 ) , 都 有 另 一 个 n − x 与 之 对 应 ( g c d ( n , n − x ) = 1 ) 所 以 φ ( n ) 一 定 是 一 个 偶 数 4.若n>2,则φ(n)为偶数\\ 首先了解一个东西——更相减损术即gcd(n,m)=gcd(n,n-m)\\ [gcd(a,b)表示a和b的最大公约数]\\ 所以,对于每一个与n互质的数x(即gcd(n,x)=1),都有另一个n-x与之对应(gcd(n,n-x)=1)\\ 所以φ(n)一定是一个偶数 4.若n>2,则φ(n)为偶数首先了解一个东西——更相减损术即gcd(n,m)=gcd(n,n−m)[gcd(a,b)表示a和b的最大公约数]所以,对于每一个与n互质的数x(即gcd(n,x)=1),都有另一个n−x与之对应(gcd(n,n−x)=1)所以φ(n)一定是一个偶数


5. ∀ n > 1 , 都 有 1 — n 中 与 n 互 质 的 数 的 和 为 φ ( n ) n 2 证 明 : 由 性 质 4 我 们 知 道 , 对 于 任 意 小 于 n 的 数 x 且 g c d ( n , x ) = 1 , 都 有 另 一 个 n − x 与 之 对 应 , 他 们 的 和 就 是 n , 一 共 有 多 少 组 这 样 的 数 呢 ? 很 明 显 是 φ ( n ) 2 则 他 们 的 和 就 是 φ ( n ) n 2 5.\forall n>1,都有1—n中与n互质的数的和为{φ(n)n \over 2}\\ 证明:\\ 由性质4我们知道,对于任意小于n的数x且gcd(n,x)=1,都有另一个n-x与之对应,他们的和就是n,一共有多少组这样的数呢?很明显是{φ(n) \over 2}\\ 则他们的和就是{φ(n)n \over 2} 5.∀n>1,都有1—n中与n互质的数的和为2φ(n)n​证明:由性质4我们知道,对于任意小于n的数x且gcd(n,x)=1,都有另一个n−x与之对应,他们的和就是n,一共有多少组这样的数呢?很明显是2φ(n)​则他们的和就是2φ(n)n​


6. 若 p 为 质 数 , 并 且 p ∣ n 且 p 2 ∣ n , 则 φ ( n ) = φ ( ⌊ n p ⌋ ) × p 证 明 : 因 为 p ∣ n , 所 以 p 是 n 的 因 子 , 又 因 为 p 2 ∣ n , 所 以 ⌊ n p ⌋ 含 有 n 的 所 有 因 子 , 因 为 ⌊ n p ⌋ 和 n 明 显 只 差 一 个 质 因 子 p , 我 们 用 欧 拉 函 数 的 求 和 公 式 展 开 φ ( n ) = n × ∏ i = 1 m ( 1 − 1 q i ) φ ( ⌊ n p ⌋ ) = ⌊ n p ⌋ × ∏ i = 1 m ( 1 − 1 q i ) 注 意 : 两 个 ∏ 符 号 中 的 q i 是 完 全 相 同 的 , 用 φ ( n ) 除 以 φ ( ⌊ n p ⌋ ) 商 为 p , 综 上 得 : φ ( n ) = φ ( ⌊ n p ⌋ ) × p 6.若p为质数,并且p|n且p^2|n,则φ(n)= φ(\lfloor {n \over p} \rfloor) \times p\\ 证明:\\ 因为p|n,所以p是n的因子,又因为p^2|n,所以 \lfloor {n \over p} \rfloor含有n的所有因子,\\ 因为\lfloor {n \over p} \rfloor和n明显只差一个质因子p,我们用欧拉函数\\的求和公式展开\\ φ(n)=n \times \prod\limits_{i=1}^m(1 - {1 \over q_i})\\ φ(\lfloor {n \over p} \rfloor)=\lfloor {n \over p} \rfloor \times \prod\limits_{i=1}^m(1 - {1 \over q_i})\\ 注意:两个\prod符号中的q_i是完全相同的,用φ(n)\\ 除以φ(\lfloor {n \over p} \rfloor)商为p,综上得:\\ φ(n)=φ(\lfloor {n \over p} \rfloor) \times p 6.若p为质数,并且p∣n且p2∣n,则φ(n)=φ(⌊pn​⌋)×p证明:因为p∣n,所以p是n的因子,又因为p2∣n,所以⌊pn​⌋含有n的所有因子,因为⌊pn​⌋和n明显只差一个质因子p,我们用欧拉函数的求和公式展开φ(n)=n×i=1∏m​(1−qi​1​)φ(⌊pn​⌋)=⌊pn​⌋×i=1∏m​(1−qi​1​)注意:两个∏符号中的qi​是完全相同的,用φ(n)除以φ(⌊pn​⌋)商为p,综上得:φ(n)=φ(⌊pn​⌋)×p


7. 若 p 为 质 数 且 p ∣ n , 且 p 2 不 是 n 的 因 子 , 则 有 φ ( n ) = φ ( ⌊ n p ⌋ ) × ( p − 1 ) 。 证 明 : 很 简 单 , 因 为 p 为 质 数 , 所 以 φ ( p ) = p − 1 因 为 φ 是 积 性 函 数 ( ⌊ n p ⌋ 和 p 互 质 , 因 为 p 2 不 是 n 的 因 子 ) , 所 以 φ ( n ) = φ ( ⌊ n p ⌋ ) × ( p − 1 ) 7.若p为质数且p|n,且p^2不是n的因子,则有\\ φ(n)=φ(\lfloor {n \over p} \rfloor) \times (p-1)。\\ 证明:很简单,因为p为质数,所以φ(p)=p-1\\ 因为φ是积性函数(\lfloor {n \over p}\rfloor和p互质,因为p^2不是n的因子),所以\\ φ(n)=φ(\lfloor {n \over p} \rfloor) \times (p-1) 7.若p为质数且p∣n,且p2不是n的因子,则有φ(n)=φ(⌊pn​⌋)×(p−1)。证明:很简单,因为p为质数,所以φ(p)=p−1因为φ是积性函数(⌊pn​⌋和p互质,因为p2不是n的因子),所以φ(n)=φ(⌊pn​⌋)×(p−1)


8. ∑ p ∣ n φ ( p ) = n 这 个 证 明 思 想 是 很 重 要 的 , 你 可 以 深 入 地 想 一 想 证 明 : 如 果 g c d ( a , b ) = k , 那 么 g c d ( a k , b k ) = 1 如 果 上 式 不 成 立 , 那 么 一 定 存 在 一 个 p 使 得 p 与 k 互 质 且 p 不 是 a , b 的 最 大 公 约 数 , 那 么 a , b 同 时 有 公 因 子 p , k 则 g c d ( a , b ) = p k ≠ k , 所 以 上 式 成 立 有 了 上 面 的 结 论 , 我 们 可 以 想 到 , 可 以 从 枚 举 约 数 的 角 度 出 发 , 设 f ( i ) 是 g c d ( k , n ) = i 的 数 ( 即 k ) 的 个 数 , 则 有 : n = ∑ i = 1 n f ( i ) [ 显 然 n 的 约 数 不 可 能 超 过 n ] 又 因 为 f ( i ) = φ ( n i ) ( 用 上 面 的 公 约 数 公 式 化 简 ) 所 以 n = φ ( d ) ( 注 意 d 和 n d 是 对 称 的 ) 8.\sum\limits_{p|n}φ(p) = n\\ 这个证明思想是很重要的,你可以深入地想一想\\ 证明:\\ 如果 gcd(a,b)=k,那么gcd({a \over k},{b \over k})=1\\ 如果上式不成立,那么一定存在一个p使得\\p与k互质且p不是 a,b的最大公约数,那么a,b同时有公因子p,k\\ 则gcd(a,b)=pk \neq k,所以上式成立\\ 有了上面的结论,我们可以想到,可以从枚举约数的角度出发,\\ 设f(i)是gcd(k,n)=i的数(即k)的个数,则有:\\ n=\sum\limits_{i=1}^nf(i)[显然n的约数不可能超过n]\\ 又因为f(i)=φ({n \over i})(用上面的公约数公式化简)\\ 所以n=φ(d)(注意d和{n \over d}是对称的) 8.p∣n∑​φ(p)=n这个证明思想是很重要的,你可以深入地想一想证明:如果gcd(a,b)=k,那么gcd(ka​,kb​)=1如果上式不成立,那么一定存在一个p使得p与k互质且p不是a,b的最大公约数,那么a,b同时有公因子p,k则gcd(a,b)=pk​=k,所以上式成立有了上面的结论,我们可以想到,可以从枚举约数的角度出发,设f(i)是gcd(k,n)=i的数(即k)的个数,则有:n=i=1∑n​f(i)[显然n的约数不可能超过n]又因为f(i)=φ(in​)(用上面的公约数公式化简)所以n=φ(d)(注意d和dn​是对称的)


例题

  1. GCD SUM
  • 题意简述:
    求 ∑ i = 1 n ∑ i = 1 n g c d ( i , j ) \sum\limits_{i=1}^n\sum\limits_{i=1}^ngcd(i,j) i=1∑n​i=1∑n​gcd(i,j)
  • 思路:
    那么我们就可以将问题转换为
    ∑ d ∣ n ∑ i = 1 n ∑ j = 1 n d × [ g c d ( i , j ) = d ] \sum\limits_{d|n}\sum\limits_{i=1}^n\sum\limits_{j=1}^nd \times [gcd(i,j)=d] d∣n∑​i=1∑n​j=1∑n​d×[gcd(i,j)=d]
    为什么这么转换呢?观察性质8,我们发现将一个类如上面的
    式子转换为枚举约数的形式,能够很好地简化时间复杂度,
    然后在用性质8的思路,用枚举约数的形式,优化时间复杂度。即:
    ∑ d ∣ n ∑ i = 1 n ∑ j = 1 n d × [ g c d ( i , j ) = d ] \sum\limits_{d|n}\sum\limits_{i=1}^n\sum\limits_{j=1}^nd \times [gcd(i,j)=d] d∣n∑​i=1∑n​j=1∑n​d×[gcd(i,j)=d]
    将i提到前面,则原式为
    ∑ d ∣ n d ∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = d ] \sum\limits_{d|n}d\sum\limits_{i=1}^n\sum\limits_{j=1}^n[gcd(i,j)=d] d∣n∑​di=1∑n​j=1∑n​[gcd(i,j)=d]
    [gcd(i,j)=d]是一个布尔值,它的含义是当[]中的表达式成立时值是1,否则是0
    由性质8中的式子,我们可以得到:
    ∑ d ∣ n d ∑ i = 1 n d ∑ j = 1 n d [ g c d ( i , j ) = 1 ] \sum\limits_{d|n}d\sum\limits_{i=1}^{n \over d}\sum\limits_{j=1}^{n \over d}[gcd(i,j)=1] d∣n∑​di=1∑dn​​j=1∑dn​​[gcd(i,j)=1]
    发 现 : ∑ j = 1 n d [ g c d ( i , j ) = 1 ] 与 我 们 所 接 触 的 欧 拉 函 数 很 像 , 但 是 上 界 阻 碍 了 我 们 对 他 的 变 形 , 所 以 我 们 考 虑 更 换 上 界 观 察 思 考 我 们 知 道 : 如 果 g c d ( i , j ) = 1 , 那 么 g c d ( j , i ) 也 是 1 所 以 我 们 枚 举 的 时 候 , 只 需 要 把 j 的 上 界 变 为 i , 得 到 的 结 果 数 乘 以 2 就 可 以 了 但 是 , 当 i = j = 1 的 时 候 , 会 出 现 重 复 统 计 , 所 以 要 减 去 1 发现:\sum\limits_{j=1}^{n \over d}[gcd(i,j)=1]与我们所接触的欧拉函数很像,但是上界阻碍了\\ 我们对他的变形,所以我们考虑更换上界\\ 观察思考我们知道:如果gcd(i,j)=1,那么gcd(j,i)也是1\\ 所以我们枚举的时候,只需要把j的上界变为i,得到的结果数乘以2就可以了\\ 但是,当i=j=1的时候,会出现重复统计,所以要减去1 发现:j=1∑dn​​[gcd(i,j)=1]与我们所接触的欧拉函数很像,但是上界阻碍了我们对他的变形,所以我们考虑更换上界观察思考我们知道:如果gcd(i,j)=1,那么gcd(j,i)也是1所以我们枚举的时候,只需要把j的上界变为i,得到的结果数乘以2就可以了但是,当i=j=1的时候,会出现重复统计,所以要减去1
    g c d 的 上 界 变 为 i , 把 他 转 换 成 欧 拉 ∑ j = 1 i [ g c d ( i , j ) ] = 1 等 价 于 ​ φ ( i ) gcd的上界变为i,把他转换成欧拉\sum\limits_{j=1}^i[gcd(i,j)]=1等价于 ​ φ(i) gcd的上界变为i,把他转换成欧拉j=1∑i​[gcd(i,j)]=1等价于​φ(i)
    ∑ d ∣ n d ( ( 2 × ∑ i = 1 n d ​ φ ( i ) ) − 1 ) \sum\limits_{d|n}d((2 \times \sum\limits_{i=1}^{n \over d} ​ φ(i))-1) d∣n∑​d((2×i=1∑dn​​​φ(i))−1)
    这样,我们只需要用线性筛求出每个数的欧拉函数值,再用前缀数组sum记录
    就能用O(n)的时间复杂度完成此题(线性筛在注释里有解释,不懂得可以去百度
    一下 ~~逃)

代码

#include <cstdio>
#include <iostream>using namespace std;const int maxn = 1e5 + 20;
int phi[maxn], pri[maxn], n, cnt;//phi[i]表示i的欧拉函数值,pri数组用来存素数,cnt是素数数量
long long sum[maxn], ans = 0;//sum记录前缀和,ans表示答案
bool is_pri[maxn];//标记每个数是否为素数void get_euler()
{phi[1] = is_pri[1] = 1;//初始化for (int i = 2; i <= n; i++)//从2开始枚举每个素数,如果枚举到他的倍数就打上标记{if (!is_pri[i]) pri[++cnt] = i, phi[i] = i - 1;//i是质数,欧拉函数值是i-1,加入pri数组中for (int j = 1; j <= cnt && i * pri[j] <= n; j++)//对n以内的数进行合数筛除和计算欧拉值{is_pri[i * pri[j]] = true;//标记合数if (i % pri[j] == 0)//线性筛保证每个数只被自己最小的因子晒去,所以i%pri[j]==0退出循环{phi[i * pri[j]] = phi[i] * pri[j];//具体的,看性质6break;//退出}elsephi[i * pri[j]] = phi[i] * phi[pri[j]];//性质7}}for (int i = 1; i <= n; i++)sum[i] = sum[i - 1] + phi[i];//维护前缀和
}int main()
{cin >> n;get_euler();for (int i = 1; i <= n; i++) ans += i * (sum[n / i] * 2 - 1);//计算答案cout << ans;  return 0;
}

第一次写博客,如果有不对的地方欢迎私聊笔者,最后支持一下吧,求(`・ω・´)

欧拉函数定义及其性质相关推荐

  1. 欧拉函数φ(x)相关性质及计算

    定义: 对 正整数nnn,欧拉函数是 小于nnn的正整数 中 与nnn互质的数的数目.(φ(1)=1\varphi(1)=1φ(1)=1) 互质:aaa与bbb互质,即gcd⁡(a,b)=1\gcd( ...

  2. 欧拉函数定理及其性质

    欧拉函数就是指:给定一个n,求得1到n中与n互质的数的个数 再介绍欧拉通项前,首先得介绍唯一分解定理 那么求一个数的欧拉值的公式为: φ(n)=n * (1-1/P1) * (1-1/P2) * - ...

  3. Master of Phi (欧拉函数 + 积性函数的性质 + 狄利克雷卷积)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6265 题目大意:首先T是测试组数,n代表当前这个数的因子的种类,然后接下来的p和q,代表当前这个数的因 ...

  4. (hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)

    题目: The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  5. 数学--数论-数论函数-欧拉函数

    **欧拉函数定义 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.例如euler(8)=4,因为1,3,5,7均和8互质. Euler函数表达通式: 其中p1,p2--pn为x的所有素因数 ...

  6. matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...

    数论入门1 一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数$\mu(n)$为: 当n有平方因子时,$\mu(n)=0$. 当n没有平方因子时,$\mu(n)=(-1)^{\omega(n)} ...

  7. 数论讨伐!欧拉函数!

    [欧拉函数] 任务开始. 什么是欧拉函数?我们又怎么求呢??? 此次任务的主要怪物:欧拉函数 (1)欧拉函数定义 欧拉函数嘛,当然是我们著名的莱昂哈德·欧拉发明的啦~那么他是怎么定义介个函数滴? 咳咳 ...

  8. 欧拉函数|(扩展)欧拉定理|欧拉反演

    也许更好的阅读体验 文章目录 欧拉函数 欧拉函数常用性质 欧拉定理 扩展欧拉定理 线性筛法 欧拉反演 欧拉函数 定义 欧拉函数是 小于等于 x的数中与x 互质 的数的 数目 符号 φ ( x ) \v ...

  9. 欧拉函数和莫比乌斯反演(Mobius)

    这几天研究了之前一直困扰自己很久的莫比乌斯反演,虽然自己现在学的还不是很好,就简简单单的写一下总结吧,咦,都没学会掌握我就写总结好像很欠揍,欧拉函数现在也系统的整理一下好了 一.欧拉函数 1.定义:* ...

最新文章

  1. LeetCode简单题之找出井字棋的获胜者
  2. Python培训分享:Python发展前景怎么样?
  3. sqlalchemy.exc.InternalError: (pymysql.err.InternalError) Packet sequence number wrong - got 40 expe
  4. 华为擎云w510_鸿蒙系统之后,华为突然官宣新生态,正式对windows说不
  5. BinaryReader 、BinaryWriter是方便用二进制方式读写int,double,string之类的数据
  6. 2014广州赛区比赛总结
  7. Linux 总线、设备、驱动模型的探究
  8. 将一个数组a的行和列的元素互换,存到另一个二维数组b中
  9. matlab画图,想让子图使用不同的色标
  10. 电脑有网络,但所有浏览器网页都打不开,是怎么回事?
  11. 基于用户的协同过滤推荐算法研究
  12. html5圆形进度条倒计时,时尚的圆形进度条样式的jQuery倒计时插件
  13. 车载syu一android密码,教务系统找回密码
  14. 组网技术:ADSL+无线路由器组网实例图解(组图)
  15. 计算机应用评估与反馈,《计算机应用基础》(计算机应用基础教学效果评价研究)...
  16. 使用PHPstudy在Windows服务器下部署PHP系统
  17. Spring Data JDBC自动生成的增删改查CRUD分页、排序SQL语句非常简洁没有多余的SQL
  18. OMAP3630 I2C device驱动
  19. Symbiosis(共生)和Commensalism(共栖)的区别
  20. MongoDB之查询文档

热门文章

  1. linux内存管理(一)-内存管理架构
  2. APP定制开发:APP软件开发的语言和开发环境
  3. tomcat小版本升级
  4. 初探Python声音处理(Demo)
  5. vue实现 修改密码
  6. 半导体复习-本征半导体
  7. 地平线机器人上海待遇_目前室内机器人、SLAM现状如何?行业内顶尖技术在哪些高校或企业 ?...
  8. 二维burgers方程_用格子Boltzmann方法研究二维Burgers方程
  9. m3u8 视频提取工具(下载web中的ts文件)
  10. Swift - 微信聊天群头像实现 (群聊的组合头像)