5/3 数论
拓展欧几里得
- 若 \(b=0\),返回 \(x=1,y=0\);
 - 否则:计算 \(a'=b,b'=a\bmod b\),递归计算
 
时间复杂度 \(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_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\) 即可。
时间复杂度 \(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\)。
所以,我们要求地是
用 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 通分即可
求出 \((n!)^{-1}\) 往回带即可,时间复杂度 \(O(n+\log w)\)
数论函数

积性函数:数论函数 \(f\) 满足对于 \(\forall m,n\ge 1,\gcd(n,m)=1\) 都有 \(f(nm)=f(n)f(m)\),则称 \(f\) 为积性函数。
上图所示的所有函数都是积性函数。
若去掉 \(\gcd(n,m)=1\) 仍然成立则称该函数为完全积性函数。
例:求
技巧:枚举 gcd
注意到 \(\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\)
卷积满足交换律与结合律,卷积的单位元为 \(\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\) 的性质:
- \(\mu(1)=1\)
 - \(d=\prod_{i=1}^k p_i,\ \mu(d)=(-1)^k\)
 - \(otherwise\ \mu(d)=0\)
 
莫比乌斯反演:\(F(n)=\sum_{d|n}f(d)\),有
例题:求
这个式子中后半坨拆开用等差数列求和,前半部分记 \(T=dt\),有 \(d=T/t\)
于是只需要计算 \(\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)\)
                    
                
                
            
        
浙公网安备 33010602011771号