intex_gcd(int a, int b, int& x, int& y){
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = ex_gcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
抄 wiki 的,当然前提是 d|c, 这是显然的。
欧拉定理
gcd(a,m)=1 的前提下 :
aφ(m)≡abmodφ(m)(modm)
扩展欧拉定理
ab≡{ab,b<φ(m)abmodφ(m)+φ(m),b≥φ(m)modm
证明一下:
φ(n)≤n2(odd)
φ(n)−>odd(even)
故为 log 次。
lucas 定理
(nm)≡(n/pm/p)(nmodpmmodp)(modp)
简单互质。
扩展中国剩余定理
很暴力啊兄弟。
bixi≡ai(modpi)
这一类的问题该怎么做?考虑增量法。
已经知道前 i−1 个问题的解是 ans, 考虑这 i 个数的 lcm 是 m。然后 ans+mxi 是前 i−1 个问题的通解。稍微变换 :
bi(ans+mxi)≡ai(modpi)
bim(xi)+y(pi)=(ai−bi∗ans)
同时建议使用取模优化。
稍微做了点杂题。
P2480 [SDOI2010]古代猪文
先用欧拉定理化开式子,发现模数变成了一个
squre-free number 啊。
考虑使用 lucas 暴力求值。
P4139 上帝与集合的正确用法
i→phi(i) 这样的迭代次数是 log2 次的, 所以欧拉定理直接算就行了。
P4774 [NOI2018] 屠龙勇士
考虑使用平衡树来维护这个武器,然后化成若干个线性同余方程组,使用 exCRT 求解即可。
数论分块
P2261 [CQOI2007]余数求和
n∑i=1kmodi
可以考虑先求 :
n∑i=1⌊ki⌋∗i
然后考虑枚举 ⌊ki⌋ 的 √k 种取值。
枚举 l,r 这两个左右端点,然后使用等差数列公式即可求值。
特别的 :
r=⌊k⌊ki⌋⌋
这个是显然的,然后 l=r+1 就行了。
P2260 [清华集训2012]模积和
记 n≤m
n∑i=1(nmodi)×m∑i=1mmodi−n∑i=1(nmodi)×(mmodi)
考虑左边随便算,右边仔细做。
n∑i=1(nm−ni⌊mi⌋−mi⌊ni⌋+i2⌊ni⌋⌊mi⌋)
这里懒得展开了。后面那一项咋做呢?可以使用平方和公式 ∑i2=n(n+1)(2n+1)6。
无所谓,我会插值。
关于 n,m 除法分块的仔细实现:可以考虑调到更小的一个地方取个 min.
莫比乌斯相关。
初涉反演魔术。
考虑记录 μ(i),当 i 是完全平方数的倍数,μ(i)=0, 否则,μ(i)=(−1)k,其中 k 代表质因子个数,显然的 μ(1)=1。
那这个是不是可以进行筛法,显然。
voidgetMu(){
mu[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!flg[i]) p[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
flg[i * p[j]] = 1;
if (i % p[j] == 0) {
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话