5/3 数论

拓展欧几里得

\[ax+by=\gcd(a,b) \]

  • \(b=0\),返回 \(x=1,y=0\);
  • 否则:计算 \(a'=b,b'=a\bmod b\),递归计算

\[a'x'+b'y'=\gcd(a',b')=\gcd(a,b) \]

\[ay'+b\left(x'-\left\lfloor\dfrac a b\right\rfloor y'\right)=\gcd(a,b) \]

\[\begin{cases}x=y'\\y=x'-\left\lfloor\dfrac a b\right\rfloor y'\end{cases} \]

时间复杂度 \(O(\log \omega)\),构造斐波那契数可以跑满。

inline ll exgcd(ll a, ll b, ll &x, ll &y) {
	if(b == 0) {
		x = 1, y = 0;
		return a;
	}
	ll g = exgcd(b, a % b, x, y);
	ll t = x; x = y; y = t - (a / b) * y;
	return g;
}

模板题:P5656 二元一次方程组

\(1\) 青蛙的约会

\[t(m-n)+(y-x)=qL,\ \ qL+t(n-m)=y-x \]

求出 \(t_0\) 检验 \(\gcd\) 并取模求出最小解即可。

ll x,y,n,m,L;
inline void exgcd(ll a,ll b){
	if(b==0) {
		x=1,y=0;
		return ;
	}
	exgcd(b,a%b);
	ll t=x;x=y;y=t-(a/b)*y;
}
inline ll gcd(ll a,ll b){
	if(b==0) return a;
	return gcd(b,a%b);
}
int main(){
	ll X,Y;
	read(X);read(Y);read(m);read(n);read(L);
	if(n<m) swap(n,m),swap(X,Y);
	exgcd(n-m,L);
	ll d=gcd(n-m,L);
	if((X-Y)%d!=0||m==n) puts("Impossible");
	else writeln((x*(X-Y)/d%(L/d)+(L/d))%(L/d));
	return 0;
}

中国剩余定理

求同余方程组 \(x\equiv y_i\pmod {b_i}\)

解法:记 \(M=\prod b_i,\ M_i=\dfrac M {b_i}\)\(M_i\)\(b_i\) 互质,因此存在 \(u_iM_i+v_ib_i=\gcd(M_i,b_i)=1\)

构造 \(x_0=\sum\limits_{i=1}^n y_iu_iM_i\) 即可。

\[x_0=\sum\limits_{i=1}^n y_iu_iM_i\equiv y_iu_iM_i=y_i(1-v_ib_i)\equiv y_i\pmod {b_i} \]

时间复杂度 \(O(n\log \omega)\)

模板题:P1495

拓展中国剩余定理 \(ex\text{CRT}\)

假设前 \(k\) 个方程组地解为 \(x_k\),记 \(M_k=\text{lcm}(b_1\sim b_k)\),则解为 \(x_k+u\cdot M_k\)

所以,我们要求地是

\[x_k+u\cdot M_k\equiv y\pmod b \]

\[u\cdot M_k-v\cdot m=y-x_k \]

用 exgcd 求解即可。总的时间复杂度 \(O(n\log \omega)\)

	lcm = a, now = b;
	rep(i, 2, n) {
		read(a); read(b);
		b = (b - now % a + a) % a;
		ll x, y;
		ll d = exgcd(lcm, a, x, y);
		x = x * (b / d) % a;
		now += x * lcm;
		lcm = lcm / d * a;
		now = (now % lcm + lcm) % lcm;
	}
	writeln(now);

逆元

\(ax\equiv 1\pmod p\)\(x\)\(a\) 在模 \(p\) 意义下的逆元,记为 \(a^{-1}\)

\(a\)\(p\) 可逆,当且仅当 \(\gcd(a,p)=1\)

求解 \(ax \equiv 1\pmod p\)\(ax+py=1=\gcd(a,p)\) 使用 \(exgcd\) 即可。特殊地,对于质数 \(p\),根据费马小定理有 \(a^{p-2}\equiv a^{-1}\pmod p\)

费马小定理证明:

所有 \(ax(1\le x<p)\) 两两不相等,因此就是 \(1\sim p-1\)
所以乘积 \(a^{p-1}\times (p-1)!\equiv (p-1)!,\ a^{p-1}\equiv 1\)

以上两种求解逆元的方法,时间复杂度均为 \(O(\log p)\)

还有一种线性递推求 \(<p\) 的所有数的逆元的方法:inv[i]=(p-p/i)*inv[p%i]%p

另一个模板题 P5431 通分即可

\[i^{-1}=(i!)^{-1}(i-1)! \]

求出 \((n!)^{-1}\) 往回带即可,时间复杂度 \(O(n+\log w)\)

数论函数

image

积性函数:数论函数 \(f\) 满足对于 \(\forall m,n\ge 1,\gcd(n,m)=1\) 都有 \(f(nm)=f(n)f(m)\),则称 \(f\) 为积性函数。

上图所示的所有函数都是积性函数。

若去掉 \(\gcd(n,m)=1\) 仍然成立则称该函数为完全积性函数。

\[N=\prod_{i=1}^kp_i^{\alpha_i},\ \varphi(N)=N\prod_{i=1}^k\left(1-\dfrac 1 {p_i}\right) \]

例:求

\[\sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) \]

技巧:枚举 gcd

\[\sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j)=\sum_{d=1}^n d\sum_{i=1}^n\sum_{j=i+1}^n[\gcd(i,j)=d] \]

\[=\sum_{d=1}^n d\sum_{i=1}^{n/d}\sum_{j=i+1}^{n/d}[\gcd(i,j)=1] \]

\[=\sum_{d=1}^n d\sum_{i=1}^{n/d}\sum_{j=1}^{i-1}[\gcd(i,j)=1] \]

\[=\sum_{d=1}^n d\sum_{i=2}^{n/d}\varphi(i) \]

注意到 \(\lfloor n/d\rfloor\) 可使用整除分块,但由于预处理 \(\varphi\) 的前缀和需要 \(O(n)\),因此总的时间复杂度为 \(O(n)\)

inline void getPhi(int MAX) {
	phi[1] = 1;
	rep(i, 2, MAX) {
		if(!vis[i])
			phi[i] = i - 1, prime[++cnt] = i;
		for(int j = 1; j <= cnt && i * prime[j] <= MAX; j ++) {
			vis[i * prime[j]] = 1;
			if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1);
			else {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
		}
	}
	rep(i, 2, MAX) sum[i] = sum[i - 1] + phi[i];
}
int main () {
	read(n);
	getPhi(n);
	for(ll l = 1, r = 1; l <= n; l = r + 1) {
		ll val = n / l;
		r = n / val;
		ans += 1ll * sum[val] * (l + r) * (r - l + 1) / 2;
	}
	writeln(ans);	
	return 0;
}

各类积性函数线性筛法


狄利克雷卷积:对于两个数论函数 \(f,g\)\(h=f*g\)

\[h(n)=\sum_{d|n}f(d)g(\dfrac n d) \]

卷积满足交换律与结合律,卷积的单位元为 \(\epsilon\)

\[\epsilon*f=f,\ d_k=Id_k*Id_0,\ \varphi*Id_0=Id_1,\ \mu*Id_0=\epsilon \]

其中 \(\varphi*Id_0=Id_1\) 表示 \(\sum_{d|n}\varphi(d)=n\)

\(\mu*Id_0=\epsilon\) 表示 \(\mu\) 是卷积意义下 \(Id_0\) 的逆元,并且 \(\sum_{d|n}\mu(d)=[n=1]\),即莫比乌斯反演。这一性质可以巧妙运用在 \([\gcd(i,j)=1]\) 求解上。

\(\mu\) 的性质:

  1. \(\mu(1)=1\)
  2. \(d=\prod_{i=1}^k p_i,\ \mu(d)=(-1)^k\)
  3. \(otherwise\ \mu(d)=0\)

\[\sum_{d|n}\dfrac{\mu(d)}d=\dfrac{\varphi(n)}n \]

莫比乌斯反演:\(F(n)=\sum_{d|n}f(d)\),有

\[f(n)=\sum_{d|n}\mu(d)F(\dfrac n d) \]


例题:求

\[\sum_{i=1}^n\sum_{j=1}^n lcm(i,j)=\sum_{i=1}^n\sum_{j=1}^n\dfrac{ij}{\gcd(i,j)} \]

\[=\sum_{d=1}^n d\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[\gcd(i,j)=1] \]

\[=\sum_{d=1}^n d\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij\sum_{t|\gcd(i,j)}\mu(t) \]

\[=\sum_{d=1}^n d\sum_{t=1}^{n/d}\mu(t)t^2\sum_{i=1}^{n/dt}\sum_{j=1}^{n/dt}ij \]

这个式子中后半坨拆开用等差数列求和,前半部分记 \(T=dt\),有 \(d=T/t\)

\[=\sum_{T=1}^n \left(\sum_{t|T} \mu(t)t^2\dfrac T t\right)\left(\dfrac{(n/T)(n/T+1)}{2}\right)^2 \]

\[=\sum_{T=1}^n T\left(\sum_{t|T} \mu(t)t\right)\left(\dfrac{(n/T)(n/T+1)}{2}\right)^2 \]

于是只需要计算 \(\sum_{t|T} \mu(t)t\) 就可以枚举 \(T\) 计算了。

由于 \(\mu(t)\cdot t\) 是积性函数,\(\sum_{t|T}\mu(t)\cdot t\) 也是积性函数

\(F(T)=\sum_{t|T}\mu(t)\cdot t\),则当 \(T=p^{\alpha}\) 时,由于 \(i\ge 2\)\(\mu(p^i)=0\),有 \(F(T)=1-p\)

更一般地,若 \(T =\prod\limits_{i=1}^k p_i^{\alpha_i}\),有 \(F(T)=\prod\limits_{i=1}^k (1-p_i)\),使用线性筛即可。

求出 \(F\) 后,记 \(sum_T\) 表示 \(T\times F(T)\) 的前缀和,然后整除分块处理即可,时间复杂度 \(O(\sqrt n)\)

posted @ 2022-05-03 15:59  Mars_Dingdang  阅读(53)  评论(0)    收藏  举报