本文共 9407 字,大约阅读时间需要 31 分钟。
一个函数。只有毒瘤出题人会用到它。
φ ( n ) = ∑ x = 1 n [ gcd ( x , n ) = 1 ] \varphi(n)=\sum_{x=1}^{n}\big[\gcd(x,n)=1\big] φ(n)=x=1∑n[gcd(x,n)=1]
即,所有小于等于 n n n 的正整数,与 n n n 互质的有多少个。
有好多好多公式呢。
如果 a a a 和 b b b 互质,那么 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)
注:这是我在 c s d n \rm{csdn} csdn 上曾经看到过的一篇证明
发现 gcd ( x , a b ) = 1 \gcd(x,ab)=1 gcd(x,ab)=1 的充要条件是 gcd ( x , a ) = 1 ∧ gcd ( x , b ) = 1 \gcd(x,a)=1\wedge\gcd(x,b)=1 gcd(x,a)=1∧gcd(x,b)=1 。
将 1 , 2 , 3 , … , a b 1,2,3,\dots,ab 1,2,3,…,ab 写成一个矩阵:
1 2 3 … b b + 1 b + 2 b + 3 … 2 b 2 b + 1 2 b + 2 2 b + 3 … 3 b ⋮ ⋮ ⋮ ⋱ ⋮ ( a − 1 ) b + 1 ( a − 1 ) b + 2 ( a − 1 ) b + 3 … a b \begin{matrix} 1&2&3&\dots&b\\ b+1&b+2&b+3&\dots&2b\\ 2b+1&2b+2&2b+3&\dots&3b\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ (a-1)b+1&(a-1)b+2&(a-1)b+3&\dots&ab \end{matrix} 1b+12b+1⋮(a−1)b+12b+22b+2⋮(a−1)b+23b+32b+3⋮(a−1)b+3………⋱…b2b3b⋮ab
现在,某个元素 ( x , y ) (x,y) (x,y) 就是 x b + y xb+y xb+y(行从 0 0 0 开始编号,列从 1 1 1 开始编号)。
由于 x b + y xb+y xb+y 与 b b b 互质,所以 y y y 与 b b b 互质。而 y ≤ b y\le b y≤b ,所以不同的 y y y的数量是 φ ( b ) \varphi(b) φ(b) 。
然后考虑 x x x 。发现一列上的元素构成模 a a a 的完全剩余系。(这应该是初等数论基础内容,不给出证明了。)所以,对于一个定值 y y y ,只有 φ ( a ) \varphi(a) φ(a) 个 x x x 满足 x b + y xb+y xb+y 与 a a a 互质。
乘法原理, φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b) ,得证。
如果 p p p 是一个质数, k k k 是正整数,那么 φ ( p k ) = p k − 1 ( p − 1 ) \varphi(p^k)=p^{k-1}(p-1) φ(pk)=pk−1(p−1)
证明:考虑有多少个 x x x 满足 x ≤ p k x\le p^k x≤pk 且 gcd ( x , p k ) ≠ 1 \gcd(x,p^k)\ne 1 gcd(x,pk)=1 。
如果 x x x 与 p p p 互质,那么 x x x 和 p k p^k pk 互质;如果 x x x 与 p p p 不互质,那么 x x x 和 p k p^k pk 不互质。
x x x 与 p p p 不互质,等价于 x x x 是 p p p 的倍数——因为 p p p 是质数。
在 p k p^k pk 范围中,有多少个数是 p p p 的倍数呢? p k p = p k − 1 \frac{p^k}{p}=p^{k-1} ppk=pk−1 个。
作差即可。 φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) \varphi(p^k)=p^k-p^{k-1}=p^{k-1}(p-1) φ(pk)=pk−pk−1=pk−1(p−1) ,得证。
再结合 积性函数
,如果 n n n 的唯一质数分解是 n = p 1 t 1 p 2 t 2 p 3 t 3 … p m t m n=p_1^{t_1}p_2^{t_2}p_3^{t_3}\dots p_m^{t_m} n=p1t1p2t2p3t3…pmtm ,那么
φ ( n ) = ∏ x = 1 m p x t x − 1 ( p x − 1 ) \varphi(n)=\prod_{x=1}^{m}p_x^{t_x-1}(p_x-1) φ(n)=x=1∏mpxtx−1(px−1)
发现 p x t x − 1 ( p x − 1 ) = p x t x × p x − 1 p x p_x^{t_x-1}(p_x-1)=p_x^{t_x}\times\frac{p_x-1}{p_x} pxtx−1(px−1)=pxtx×pxpx−1 。那么
φ ( n ) = n ∏ x = 1 m ( 1 − 1 p x ) \varphi(n)=n\prod_{x=1}^{m}(1-\frac{1}{p_x}) φ(n)=nx=1∏m(1−px1)
这个东西其实可以理解为 容斥。
因为 p x − 1 p x = 1 − 1 p x \frac{p_x-1}{p_x}=1-\frac{1}{p_x} pxpx−1=1−px1 ,所以说, ∏ p x − 1 p x \prod\frac{p_x-1}{p_x} ∏pxpx−1 就是考虑,是否要去掉 p x p_x px 的倍数——毕竟 n × 1 p x n\times\frac{1}{p_x} n×px1 就是 p x p_x px 的倍数个数。
嗯?你说为什么长的不像普通容斥?我个人倾向于,将其当做类似母函数的东西。
前面已经讲过 积性函数
,这里就略过。
还有一个很美妙的结论(使得杜教筛在 φ \varphi φ 上可以大显身手): ∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n d∣n∑φ(d)=n
注:这是我在博客园中看到的
将 { 1 , 2 , 3 , … , n } \{1,2,3,\dots,n\} { 1,2,3,…,n} 按如下规则划分: S d = { x ∣ gcd ( x , n ) = d } S_d=\{x|\gcd(x,n)=d\} Sd={ x∣gcd(x,n)=d} ,即公因数为 d d d 的。
显然,任意 x ∈ S d x\in S_d x∈Sd ,可以写成 x = k d ( 1 ≤ k ≤ n d x=kd(1\le k\le\frac{n}{d} x=kd(1≤k≤dn 但不一定取遍 ) ) ) 。
由定义, gcd ( x , n ) = gcd ( k d , n ) = d ⇒ gcd ( k , n d ) = 1 \gcd(x,n)=\gcd(kd,n)=d\Rightarrow\gcd(k,\frac{n}{d})=1 gcd(x,n)=gcd(kd,n)=d⇒gcd(k,dn)=1 。
这样一来, ∣ S d ∣ = φ ( n d ) |S_d|=\varphi(\frac{n}{d}) ∣Sd∣=φ(dn) 。于是 n = ∑ d ∣ n card ( S d ) = ∑ d ∣ n φ ( n d ) n=\sum_{d|n}\text{card}(S_d)=\sum_{d|n}\varphi(\frac{n}{d}) n=∑d∣ncard(Sd)=∑d∣nφ(dn) ,得证。
还有一个骚骚的操作(将 n n n 移项,类似容斥,证明略):
∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n} d∣n∑dμ(d)=nφ(n)
对于所有 n > 2 n>2 n>2 都有 φ ( n ) \varphi(n) φ(n) 为偶数。
证明:如果 n n n 中含有任意一个奇素因数 p p p ,那么根据 一般的计算
,可知 2 ∣ ( p − 1 ) ∣ φ ( n ) 2|(p-1)|\varphi(n) 2∣(p−1)∣φ(n) 。
而不包含奇素因数的数只有 1 1 1 和 2 2 2 。
接下来的这一点,是很多题复杂度的保障:如果 2 ∣ n 2|n 2∣n ,那么 φ ( n ) ≤ n 2 \varphi(n)\le \frac{n}{2} φ(n)≤2n 。
证明: n n n 中含有 p = 2 p=2 p=2 这一质因子。根据 特殊的计算
, φ ( n ) ≤ n ( 1 − 1 p ) = n 2 \varphi(n)\le n(1-\frac{1}{p})=\frac{n}{2} φ(n)≤n(1−p1)=2n 。
那么, n ′ = φ ( n ) n'=\varphi(n) n′=φ(n) 需要多少次到达 1 1 1 呢? O ( log n ) \mathcal O(\log n) O(logn) 次。结合 φ ( n ) \varphi(n) φ(n) 永远是偶数,每次都至少变小一半嘛,除了第一步。
直接用 一般的计算
即可。
int getPhi(int n){ int res = 1; for(int x=2; 1ll*x*x<=n; ++x){ if(n%x) continue; n /= x, res *= (x-1); while(n%x == 0) n /= x, res *= x; } if(n != 1) res *= (n-1); return res;}
还有写法二:
long long __phi(long long n){ long long res = n; for(int i=2; 1ll*i*i<=n; ++i) if(n%i == 0){ res = res/i*(i-1); while(n%i == 0) n /= i; } if(n != 1) res = res/n*(n-1); return res;}
与线性筛相配合。毕竟是积性函数。
void sievePrime(int n){ for(int i=2; i<=n; ++i) isPrime[i] = true; primes.clear(); phi[1] = 1; for(int i=2; i<=n; ++i){ if(isPrime[i]){ primes.push_back(i); phi[i] = i-1; } for(int j=0,len=primes.size(); j
就使用 骚骚的操作
,用 μ \mu μ 来算(当然,你直接当成容斥也可以)。
int getPhi(int n){ vector ys; // 质因数 while(n != 1){ d = findDivisor(n); // 找到一个质因数 ys.push_back(d); while(n%d == 0) n /= d; } sort(ys.begin(),ys.end()); n = ys.size(); int res = n; for(int S=1; S<(1<>i&1){ sgn = -sgn; cnt /= ys[i]; } res += sgn*cnt; } return res;}
好处是什么呢?——可以求 ∑ x = 1 n [ gcd ( x , m ) = 1 ] \sum_{x=1}^{n}[\gcd(x,m)=1] ∑x=1n[gcd(x,m)=1] 。只需要稍稍作一点改动。
int getCoprime(int n,int m){ vector ys; // 质因数 while(m != 1){ d = findDivisor(m); // 找到一个质因数 ys.push_back(d); while(m%d == 0) m /= d; } sort(ys.begin(),ys.end()); m = ys.size(); int res = n; for(int S=1; S<(1<>i&1) sgn = -sgn, cnt /= ys[i]; res += sgn*cnt; } return res;}
能够做到 n \sqrt n n 的复杂度——也就是说,均摊 O ( 1 ) \mathcal O(1) O(1) 。
首先线性筛求出 ∀ x ≤ n \forall x\le \sqrt n ∀x≤n 的 φ ( x ) \varphi(x) φ(x) ,然后 O ( n ) \mathcal O(\sqrt n) O(n) 的求出 φ ( n ) \varphi(n) φ(n) 。接下来要做的,就是研究 φ ( x ) , φ ( n x ) , φ ( n ) \varphi(x),\varphi(\frac{n}{x}),\varphi(n) φ(x),φ(xn),φ(n) 的关系。
观察 2.3.特殊的计算
中的右半部分,也就是 ∏ p ∣ n , p ∈ P ( 1 − 1 p ) \prod_{p|n,p\in\Bbb{P}}(1-\frac{1}{p}) ∏p∣n,p∈P(1−p1) ,将其记为 λ ( n ) \lambda(n) λ(n) 。于是就有 n λ ( n ) = φ ( n ) n\lambda(n)=\varphi(n) nλ(n)=φ(n) 。
考虑这样一个恒等式:记 d = gcd ( x , n x ) d=\gcd(x,\frac{n}{x}) d=gcd(x,xn) ,那么
λ ( x ) λ ( n x ) = λ ( n ) λ ( d ) \lambda(x)\lambda\left(\frac{n}{x}\right)=\lambda(n)\lambda(d) λ(x)λ(xn)=λ(n)λ(d)
证明:如果 p ∣ d p|d p∣d ,那么会被计算两次;如果 p p p 不是 n n n 的因数,那么一次也不会计算;其他的情况,只计算一次。证毕。
把两边同时乘一个 n n n 可以得到:
x λ ( x ) ⋅ n x ⋅ λ ( n x ) = n λ ( n ) λ ( d ) ⇒ φ ( x ) φ ( n x ) = φ ( n ) φ ( d ) d ⇒ φ ( n x ) = φ ( n ) φ ( d ) d φ ( x ) x\lambda(x)\cdot \frac{n}{x}\cdot \lambda\Big(\frac{n}{x}\Big)=n\lambda(n)\lambda(d)\\ \Rightarrow \varphi(x)\varphi\Big(\frac{n}{x}\Big)=\varphi(n)\frac{\varphi(d)}{d}\\ \Rightarrow\varphi\Big(\frac{n}{x}\Big)=\frac{\varphi(n)\varphi(d)}{d\varphi(x)} xλ(x)⋅xn⋅λ(xn)=nλ(n)λ(d)⇒φ(x)φ(xn)=φ(n)dφ(d)⇒φ(xn)=dφ(x)φ(n)φ(d)
然后战斗结束了。更通用一点的公式就是: φ ( a ) φ ( b ) = φ ( a b ) φ [ gcd ( a , b ) ] gcd ( a , b ) \varphi(a)\varphi(b)=\varphi(ab)\frac{\varphi[\gcd(a,b)]}{\gcd(a,b)} φ(a)φ(b)=φ(ab)gcd(a,b)φ[gcd(a,b)]
可以发现,这是自洽的——在 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 的情况下,自然满足 3.0.积性函数
咯。
用来解决带取模的、指数极大的情况。
传说中的——
a φ ( b ) ≡ { 1 ( gcd ( a , b ) = 1 ) a 2 φ ( b ) ( gcd ( a , b ) ≠ 1 ) ( m o d b ) a^{\varphi(b)}\equiv\begin{cases} 1&(\gcd(a,b)=1)\\ a^{2\varphi(b)}&(\gcd(a,b)\ne 1) \end{cases}\pmod b aφ(b)≡{ 1a2φ(b)(gcd(a,b)=1)(gcd(a,b)=1)(modb)
内涵就是——
a x ≡ { a x m o d φ ( b ) ( gcd ( a , b ) = 1 ) a x m o d φ ( b ) + φ ( b ) ( gcd ( a , b ) ≠ 1 ∧ x ≥ φ ( b ) ) a^x\equiv\begin{cases} a^{x\bmod \varphi(b)}&(\gcd(a,b)=1)\\ a^{x\bmod \varphi(b)+\varphi(b)}&(\gcd(a,b)\ne 1\wedge x\ge\varphi(b)) \end{cases} ax≡{ axmodφ(b)axmodφ(b)+φ(b)(gcd(a,b)=1)(gcd(a,b)=1∧x≥φ(b))
第二个我不会证明。对于第一个,用这样的方法证明:
考虑 n = φ ( b ) n=\varphi(b) n=φ(b) 个与 b b b 互质且小于等于 b b b 的数 x 1 , x 2 , x 3 , … , x n x_1,x_2,x_3,\dots,x_n x1,x2,x3,…,xn 。
都乘以 a a a ,得到 a x 1 , a x 2 , a x 3 , … , a x n ax_1,ax_2,ax_3,\dots,ax_n ax1,ax2,ax3,…,axn 。由于 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 ,所以新的这 n n n 个数仍然与 b b b 互质。
将其同时 m o d b \bmod\thickspace b modb ,显然,仍然与 b b b 互质,并且两两不同。与 b b b 互质并且小于等于 b b b 的数一共只有 n n n 个,所以两个序列形成的集合是相同的。
都累乘,一定相等,即 ∏ i = 1 n x i ≡ ∏ i = 1 n ( a x i ) ( m o d b ) \prod_{i=1}^{n}x_i\equiv\prod_{i=1}^{n}(ax_i)\pmod b i=1∏nxi≡i=1∏n(axi)(modb)
所以 a n = a φ ( b ) ≡ 1 ( m o d b ) a^n=a^{\varphi(b)}\equiv1\pmod b an=aφ(b)≡1(modb) 。
。应该算比较常规的方法。
。用欧拉公式解决关于 x x x的方程 a x ≡ 1 ( m o d b ) a^x\equiv 1\pmod b ax≡1(modb)
。 p.s. \text{p.s.} p.s.这个名字是缩写。
我们已经知道了 φ ∗ I = i d \varphi*I=id φ∗I=id ,直接用即可。
放公式:令 S n = ∑ i = 1 n φ ( i ) S_n=\sum_{i=1}^{n}\varphi(i) Sn=∑i=1nφ(i) ,一定有
S n = n ( n + 1 ) 2 − ∑ d = 1 n S ( ⌊ n d ⌋ ) S_n=\frac{n(n+1)}{2}-\sum_{d=1}^{n}S(\lfloor\frac{n}{d}\rfloor) Sn=2n(n+1)−d=1∑nS(⌊dn⌋)
mapwk; /* WK(freopen) or2 */long long djs(int n){ if(n < SqrtN) return phi[n]; /* 线性筛中得到的结果 */ if(wk.count(n)) return wk[n]; /* 记忆化 */ long long res = 1ll*n*(n+1)>>1; for(int l=1,r; l<=n; l=r){ r = n/(n/l)+1; /* 整除分块 */ res -= (r-l)*djs(n/l); } return wk[n] = res;}
复杂度是 O ( n 2 3 ) \mathcal O(n^{ {2\over 3}}) O(n32) 的。不知道什么原理。
转载地址:http://qtvq.baihongyu.com/