数学
数学
1 数论
1.1 模方程
-
中国剩余定理:解决多个单元模方程组,形如
,且 两两互质。令 为所有 的乘积,记 ,使用 exgcd 得到满足 的 。令 ,则方程组最后的解 。简单证明:对 两边同时取模 ,那么 ;当 时,两边同时取模, 为 倍数。scanf("%lld", &n); rep(i, 1, n) scanf("%lld%lld", &m[i], &a[i]), M *= m[i]; rep(i, 1, n){ int w = M / m[i]; exgcd(w, m[i]); int e = w * x; (x0 += e * a[i]) %= M; } printf("%lld\n", (x0 + M) % M);
-
BSGS(离散对数):求解模方程
,其中 为素数。根据欧拉定理,我们只需检验 是不是解即可。我们不妨先只检验前 项,并把 保存。下面考虑 ,此时若其中有解,则存在 满足 ,即 。而上述合法的 是可以通过 map 维护, 得到的。同时,上述过程可推广至 。当 时,时间复杂度最小,为 。std::map<int, int> Mp; inline void BSGS(){ int m = (int)sqrt(n + 0.5), inv = pw(pw(a, n - 2, n), m, n); Mp.clear(); Mp[1] = 0; int fac = 1ll; rep(i, 1, m - 1){ fac = fac * a % n; if(!Mp.count(fac)) Mp[fac] = i; } fac = 1ll; rep(i, 0, m - 1){ if(Mp.count(fac * b % n)) return printf("%lld\n", i * m + Mp[fac * b % n]), void(); (fac *= inv) %= n; } printf("no solution\n"); }
例题:
-
UVA11426 GCD Extreme:
。 预处理, 回答。 -
UVA11754 Code Feat:数据分治。观察到条件个数较少,当
时,模数都较小,考虑 CRT;反之,模数都较大,考虑直接枚举,发现余数集越小、模数越大的数越优,所以枚举 最小的那个模数,枚举倍数暴力验证即可。 -
UVA11916 Emoogle Grid:发现条件只限制了竖直方向上相邻的两个方格颜色不同。小奥,当格子上方为空或为特殊格时,有
种颜色;反之,有 种颜色。显然行数 的范围是有限制的,即不能小于任何一个特殊格。统计包含所有特殊格的“不变部分”,方案数记为 ;若 ,考虑第一行“可变部分”的方案数,显然在特殊格正下方的格子会受影响,记它和“不变部分”的总方案数为 ;若 ,接下来每一行方案数 ,则有 ,把 移到右边,套 BSGS 即可。
1.2 线性筛
-
线性筛:
inline void init(){ g[1] = 1;//g[i]表示i的最小质因子 for(int i = 2; i <= _; ++i){ if(!vis[i]) pr[++tot] = i, g[i] = i; for(int j = 1; j <= tot and i * pr[j] <= _; ++j){ vis[i * pr[j]] = 1, g[i * pr[j]] = pr[j]; if(i % pr[j] == 0) break; }}}
例题:
- [POI2012] OKR-A Horrible Poem:好题。巧妙转化一下题意:如果存在一个长度
的循环节,一定满足 ,且 ,充分必要。进一步发现,总长 ,其中 表示最小循环节长度, 表示最小循环节出现次数。这样第二个条件可以通过分解 求得最短循环节长度。判断循环节是否合法,根据第一条,我们可以维护哈希 求得。线性筛加速质因数分解。
1.3 整除分块、积性函数、莫比乌斯反演、狄利克雷卷积、杜教筛
-
整除分块:
-
一般当式子中含有
时,考虑使用整除分块优化计算复杂度。 -
考虑当只做一次整除分块时,时复为
;套两层整除分块时,时复为 ;根据不断积分推导与大胆猜想,推出套三层时,时复为 ;则套 层时,时复为 。套的层数越多,越接近线性复杂度。
-
-
积性函数:
-
对于任意
,都有 ,则称 为积性函数。 -
对于任意
,都有 ,则称 为完全积性函数。 -
对于任意积性函数,都有
。 -
令
,则“ 是积性函数”与“ 是积性函数”互为充要条件。其中 称作 的和函数。还有 ,其中 。莫反就是针对 与 的相互转换。 -
若
皆为积性函数,则 为积性函数, 也为积性函数。 -
常见积性函数包括欧拉函数
与莫比乌斯函数 。 -
-
-
莫比乌斯函数:
-
-
-
【补充】类似地,有
-
-
狄利克雷卷积:
-
定义两个数论函数
的狄利克雷卷积为: -
狄利克雷卷积满足交换律、结合律、分配律。
-
若
为积性函数,则 也为积性函数。 -
定义
为狄利克雷卷积的单位元, ,满足 ,证明显然。 -
,实际上只是写法不同,本质都是中间的那个 。 -
,等价于 ,较为显然。 -
,等价于 ,较为显然。 -
,等价于 ,而这个转化就极为有用,它实现了 和 之间的转化。证明:
。 -
与莫比乌斯反演相结合,等价于给定
,则有莫反 。证明:
。
-
-
杜教筛:
-
杜教筛可在非线性时间内求积性函数的前缀和。对于求
的前缀和,构造 ,则 。快速求解 的前缀和,使用数论分块并递归求解 。不妨对 的 用线性筛预处理出来,并在递归过程中使用 map 进行记忆化,则最终可将复杂度降至 。不妨假设所求
,其中 为积性函数。构造 。 如何得到 ?将 的前缀和减去 的前缀和即可。得到: -
的前缀和:显然 。inline int getphi(int n){ if(n <= _) return phi[n]; if(pmp.count(n)) return pmp[n]; int res = n * (n + 1) / 2; for(int l = 2, r; l <= n; l = r + 1){ r = (n / (n / l)); res -= (r - l + 1) * getphi(n / l); } return pmp[n] = res; }
-
的前缀和:显然 。inline int getmu(int n){ if(n <= _) return mu[n]; if(mmp.count(n)) return mmp[n]; int res = 1; for(int l = 2, r; l <= n; l = r + 1){ r = (n / (n / l)); res -= (r - l + 1) * getmu(n / l); } return mmp[n] = res; }
-
的前缀和:不妨取 ,则 。同时 的前缀和也可以快速算得。 同理。例题:P3768 简单的数学题。 -
【补充】
-
【补充】
-
-
莫比乌斯反演:
-
-
-
莫比乌斯反演及莫比乌斯函数可以理解为容斥原理在数论中的一种表现形式。
-
形式一:
,其中 都从 开始, 。 -
形式二:
,其中 都从 开始, 。 -
形式三:
,其中 都从 开始, 。 -
以上三种形式都可以
预处理,单次询问 ,数论分块维护。 -
推广一:
,其中 都从 开始, 。
-
例题:(默认
- SPOJ Visible Lattice Points:
求
三维可见格点数量。
- HDU 4746 Mophues:
多次询问给定
,求 ,其中 表示 的所有可重素因子个数。
大致过程就是先把 gcd 提出来,然后常规莫反,用
- P3327 [SDOI2015] 约数个数和:
多次询问给定
,求 ,其中 表示 的约数个数。
补充定理:
两种方法最后得到的式子是相同的,然后
- P3768 简单的数学题:
给定
,求 对 取模的结果。 。
形式一眼看上去很典。像在 P1829 [国家集训队] Crash的数字表格 / JZPTAB 中,求解
省略了一些显然的推式子过程,重点在第三、四行。第三行用
- P4318 完全平方数:
多次询问
,求第 个不是某个完全平方数的正整数倍的数是多少。不考虑 作为完全平方数。
杜教筛神题!首先显然和
此时考虑
考虑二分 + 容斥,因为
- SP27942 PROD1GCD - Product it again:
多次询问
,每次给定 ,求 对 取模的值。
放一道乘积形式的题。因为我们先前所学习的大部分形式与转化,都是基于加法之上的。所以对于乘法的形式,没有直接且 trival 的形式去直接化简。所以通常来讲,都是把因数合并,而因数的指数就变成相加形式了,所以我们就可以对指数进行讨论,回归到我们所熟悉的形态。回归本题,推式子:
显然有
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2023-12-26 【CF30E】Tricky and Clever Password 题解(manacher + exKMP)