【学习笔记】数论

1.【CRT】

1.1【标准同余方程】

CRT板子

ll M = 1;
for (ll v : m) M *= v;
__int128 ans = 0;
for (int i = 0; i < (int)a.size(); ++i) {
 ll Mi = M / m[i];
 ll ti = inv_exgcd(Mi % m[i], m[i]);
 ans = (ans + (__int128)a[i] * Mi % M * ti) % M;
}

EXCRT板子

Int A=0,M=1;
for(int i=1;i<=n;i++){
	Int x,y;
	Int k=exgcd(M,m[i],x,y);
	if((A-a[i])%k!=0) return -1;
	x*=(A-a[i])/k;
	A-=x*M;
	M=M/k*m[i];
	A=(A%M+M)%M;
}
int ans=(A%M+M)%M;
return ans; 

1.2【带系数的同余方程】

\(kx=a(mod m)\) 对此方程一次求解

\(kx+my=a\)

\(g=gcd(k,m)\)

\(x=a/g \times x'+m/g \times t\)\(x=a/g \times x'(mod m/g)\)

按照第一种情况求解

P4774 [NOI2018] 屠龙勇士

2.【BSGS】

【问题】

给定 \(𝑎, 𝑏, 𝑚\),求解 \(𝑎^𝑥 ≡ 𝑏 (mod 𝑚)\)。(这里的 \(𝑥\) 被称为离散对数)

且满足 $gcd(𝑎, 𝑚) = 1 $

【解法】

BSGS 本质上是根号分治。

\(𝑡 = ⌈ \sqrt 𝑚⌉\),把未知数写成 \(𝑥 = 𝑖𝑡 − 𝑗\).

于是原方程等价于 \(𝑎^{𝑖𝑡} ≡ 𝑏𝑎^𝑗(mod 𝑚)\).

预处理所有右侧的 \(𝑏𝑎^𝑗(0 ≤ 𝑗 < 𝑡)\),放入哈希表;再枚举左侧的 \(𝑎^{𝑖𝑡}(0 ≤ 𝑖 ≤ 𝑡)\),查找是否匹配。

匹配时即可返回 \(𝑥 = 𝑖𝑡 − 𝑗\)。时间和空间复杂度均为 \(𝑂(\sqrt 𝑚)\)

int B=sqrtl(p)+1;
unordered_map<int,int> mp;
int pw=1;
for(int i=1;i<=B;i++){
	mp[(b*=a)%=p]=i;
	(pw*=a)%=p;
}	
int k=1;
for(int i=1;i<=B;i++){
	if(mp.count((k*=pw)%=p)) return i*B-mp[k];
}
return -1;

3.【狄利克雷前缀和】

狄利克雷前缀和:⼀般指任意数论函数卷上 \(I\)(狄利克雷差分则是卷上 \(\mu\)),可以做到 \(O(n \log \log n)\),事实上卷上⼤部分数论函数都可以以相同的复杂度处理。

后缀和是⼀致的。

4.【莫比乌斯反演】

可视为狄利克雷差分

\(\mu\)\(I\) 的逆元

\[\mu(n) = \begin{cases} 1, & n = 1 \\ (-1)^k, & n \text{ 无平方因子(即所有 } a_i = 1 \text{)} \\ 0, & n \text{ 有平方因子(即存在 } a_i \ge 2 \text{)} \end{cases}\]

莫反的三种形式

\([gcd(i,j)=1]=\sum_{k|i,j}\mu(k)\)

\(f(n)=\sum_{n|i}g(i) \iff g(n)=\sum_{n|i}\mu(\frac{i}{n})f(i)\)

\(f(n)=\sum_{i|n}g(i) \iff g(n)=\sum_{i|n}\mu(\frac{n}{i})f(i)\)

5.【杜教筛&min25筛】

posted @ 2026-08-21 15:33  Aistyr  阅读(7)  评论(0)    收藏  举报