【学习笔记】数论
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)\)
按照第一种情况求解
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)\)

浙公网安备 33010602011771号