Lucas 定理
组合意义天地灭。
Lucas 定理
问题
:给定 与 ,其中 与 相当大,而 则相对较小,要求计算 的值。
一般的预处理逆元以及递推的方法在
对于
与 ,有 ,其中 , ,也即 与 的 进制表示。
上边的这一坨就是 Lucas 定理了。不过这貌似跟我们平常使用的递归形式不太一样?
对于
与 ,有 。
这是我们平常见到的形式。不过,稍作观察就可以发现,这两种形式是等价的,在此不做证明。
下文中,如无特殊说明,均有
下面我们尝试证明 Lucas 定理。
引理
:对于任意 且 , 。
这是好证明的,我们直接从定义下手即可。由于
右边显然为
引理
:对于任意 ,有 。
通过二项式定理,我们得到
现在来做一些推导:
第
又由二项式定理,我们立即得到:
那么 Lucas 定理是显而易见的。
实际使用中,由于给出的
扩展 Lucas 定理
这玩意虽然叫定理,但事实上只是个算法。
发现 Lucas 定理只能解决
问题
:给定 ,其中 与 相当大,要求计算 的值。
由于未保证
对于
其中
考虑记上边的式子为
由于
这步变换不难理解。
下一步的化简就需要用到
这非常显而易见,不予证明。那么我们可以将式子作进一步化简:
于是就做完了。最后再用 CRT 合并一下就可以求得答案。
通过分析可以得到,时间复杂度为
constexpr int N = 1050; i64 n, m, p; i64 a[N], b[N]; i64 fastPow(i64 base, i64 exp, i64 mod) { i64 res = 1; for (; exp; exp >>= 1) { if (exp & 1) (res *= base) %= mod; (base *= base) %= mod; } return res; } i64 exgcd(i64 a, i64 b, i64 &x, i64 &y) { if (!b) return x = 1, y = 0, a; i64 d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } i64 inv(i64 num, i64 mod) { i64 x, y; exgcd(num, mod, x, y); return (x + mod) % mod; } i64 f(i64 n, i64 p, i64 pk) { if (!n) return 1; i64 cir = 1, rst = 1; for (i64 i = 1; i <= pk; i++) { if (i % p) (cir *= i % pk) %= pk; } cir = fastPow(cir, n / pk, pk); for (i64 i = pk * (n / pk); i <= n; i++) { if (i % p) (rst *= i % pk) %= pk; } return f(n / p, p, pk) * cir % pk * rst % pk; } i64 g(i64 n, i64 p) { i64 res = 0, cpy = p; for (; p <= n; p *= cpy) res += n / p; return res; } i64 C(i64 n, i64 m, i64 p, i64 pk) { i64 a = f(n, p, pk), b = inv(f(m, p, pk), pk), c = inv(f(n - m, p, pk), pk); return a * b % pk * c % pk * fastPow(p, g(n, p) - g(m, p) - g(n - m, p), pk) % pk; } i64 exLucas(i64 n, i64 m, i64 mod) { i64 cpy = mod, res = 0; int cnt = 0; for (i64 i = 2; i * i <= cpy; i++) { if (cpy % i == 0) { i64 pk = 1; while (cpy % i == 0) cpy /= i, pk *= i; a[++cnt] = pk, b[cnt] = C(n, m, i, pk); } } if (cpy != 1) a[++cnt] = cpy, b[cnt] = C(n, m, cpy, cpy); for (int i = 1; i <= cnt; i++) { i64 k = mod / a[i], t = inv(k, a[i]); (res += b[i] * k % mod * t % mod) %= mod; } return res; }
本文作者:forgot-dream
本文链接:https://www.cnblogs.com/forgot-dream/p/17625040.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步