ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(扩展)卢卡斯定理

2021-12-14 14:00:11  阅读:210  来源: 互联网

标签:lfloor frac bmod 定理 扩展 times choose 卢卡斯 ll


卢卡斯定理

结论

\[{n \choose m} \equiv {\lfloor \frac{n}{p} \rfloor \choose \lfloor \frac{m}{p} \rfloor} \cdot {n \bmod p \choose m \bmod p} \pmod p \]

其中 \(p\) 为质数。

证明

引理 \(1\)

\[{p \choose n} \equiv \frac{p!}{(p - n)! \cdot n!} \pmod p \]

分子含有质因数 \(p\),则当分母不含有质因数 \(p\) 时原式的值为 \(0\)

否则,当且仅当 \(n = 0\) 或 \(n = p\) 时分母也含有质因数 \(p\),原式的值为 \(\frac{p!}{p! \cdot 0!} = 1\)


引理 \(2\)

根据二项式定理知

\[(a + b)^p = {p \choose i} \sum\limits_{i = 0}^p a^ib^{p - i} \]

根据引理 \(1\) 知 \({p \choose i}\) 在模 \(p\) 意义下不同余于 \(0\),当且仅当 \(i = 0\) 或 \(i = p\),且此时 \({p \choose i}\) 在模 \(p\) 意义下同余于 \(1\)

\[\begin{aligned} (a + b)^p &= {p \choose i} \sum\limits_{i = 0}^p a^i b^{n - i} &\pmod p \\ &\equiv 1 \cdot a^0b^p + 1 \cdot a^pb^0 &\pmod p \\ &\equiv a^p + b^p &\pmod p \end{aligned} \]

则有

\[(ax + by)^p \equiv a^px^p + b^py^p \pmod p \\ \]

因为 \(p\) 是质数,由费马小定理知

\[a^{p - 1} \equiv 1 \pmod p, b^{p - 1} \equiv 1 \pmod p \]

所以

\[a^p x^p + b^p y^p \equiv ax^p + by^p \pmod p \]

证明

根据二项式定理知 \((x + 1)^n\) 中的项 \(x^m\) 的系数模 \(p\) 等于 \({n \choose m} \bmod p\)

根据引理 \(2\) 知

\[\begin{aligned} (x + 1)^n &\equiv (x + 1)^{p \lfloor \frac{n}{p} \rfloor} \cdot (x + 1)^{n\ \bmod\ p} &\pmod p\\ &\equiv (x^p + 1^p)^{\lfloor \frac{n}{p} \rfloor} \cdot (x + 1)^{n\ \bmod\ p} &\pmod p\\ &\equiv (x^p + 1)^{\lfloor \frac{n}{p} \rfloor} \cdot (x + 1)^{n\ \bmod\ p} &\pmod p \end{aligned} \]

易知:

  1. \((x^p + 1)^{\lfloor \frac{n}{p} \rfloor}\) 中的各项的次数均为 \(p\) 的倍数
  2. \((x + 1)^{n\ \bmod\ p}\) 中的各项的次数最大为 \(p - 1\)

设 \(m = pq + r\),其中 \(r < q\),则得到 \(x^m\) 只能在 \((x^p + 1)^{\lfloor \frac{n}{p} \rfloor}\) 中取到 \(q\) 个 \(x^p\),然后在 \((x + 1)^{n\ \bmod\ p}\) 中取到 \(r\) 个 \(x\)

又因为 \(q = \lfloor \frac{m}{p} \rfloor, r = m \bmod p\)

所以项 \(x^m\) 的系数模 \(p\) 等于

\[{\frac{n}{p} \choose q} \cdot {n \bmod p \choose r} \equiv {\lfloor \frac{n}{p} \rfloor \choose \lfloor \frac{m}{p} \rfloor} \cdot {n \bmod p \choose m \bmod p} \pmod p \]

所以

\[{n \choose m} \equiv {\lfloor \frac{n}{p} \rfloor \choose \lfloor \frac{m}{p} \rfloor} \cdot {n \bmod p \choose m \bmod p} \pmod p \]

总时间复杂度 \(\mathcal{O}(\sum\limits_{i = 1}^T n_i \cdot log_2n_i)\),其中 \(T\) 为询问次数

模板

P3807 【模板】卢卡斯定理/Lucas 定理

#include <cstdio>
using namespace std;

typedef long long ll;

const int maxn = 1e5 + 5;

int t, n, m, p;
ll pre[maxn], inv[maxn];

ll C(ll n, ll m, ll p)
{
	if (m > n)
		return 0;
	return pre[n] * inv[m] % p * inv[n - m] % p;
}

ll lucas(ll n, ll m, ll p)
{
	if (m == 0)
		return 1;
	return C(n % p, m % p, p) * lucas(n / p, m / p, p) % p;
}

int main()
{
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d%d", &n, &m, &p);
		pre[0] = pre[1] = 1;
		inv[0] = inv[1] = 1;
		for (int i = 2; i <= p; i++)
			pre[i] = (pre[i - 1] * i) % p;
		for (int i = 2; i <= p; i++)
			inv[i] = (p - p / i) * inv[p % i] % p;
		for (int i = 2; i <= p; i++)
			inv[i] = (inv[i - 1] * inv[i]) % p;
		printf("%lld\n", lucas(n + m, n, p));
	}
	return 0;
}

扩展卢卡斯定理

概念

求 \({n \choose m} \bmod p\) 的值,其中 \(p\) 不一定 为质数。

思想

将 \({n \choose m}\) 分解为 \(\prod\limits_{i = 1}^n p_i^{a_i}\) 的形式,因为 \(p_i^{a_i}\) 两两互质,所以可以分别求出 \({n \choose m} \bmod p_i^{a_i}\) 的值,最后再通过中国剩余定理合并。

有 \({n \choose m} = \frac{n!}{m! (n - m)!}\),则问题转化为求 \(\frac{n!}{m! (n - m)!} \bmod p\) 的值。

不妨提出 \(\frac{n!}{m! (n - m)!}\) 中所有含有质因子 \(p\) 的项,得 \(n! = p^{\lfloor \frac{n}{p} \rfloor } \cdot \lfloor \frac{n}{p} \rfloor! \cdot \prod\limits_{p \nmid i}^n i\)

其中 \(p^{\lfloor \frac{n}{p} \rfloor}\) 可以用快速幂求,\(\lfloor \frac{n}{p} \rfloor!\) 可以递归求解,边界条件为 \(0! \bmod p = 1\)

易知 \(\prod\limits_{p \nmid i}^n i\) 中的项的乘积在模 \(p_i^{a_i}\) 意义下有长度小于 \(p_i^{a_i}\) 的循环节,例如:

\[n = 19, p_i = 3, a_i = 2 \\ \begin{aligned} 19! \bmod 3^2 &= 1 \times 2 \times 4 \times 5 \times 7 \times 8 \times 10 \times 11 \times 13 \times 14 \times 16 \times 17 \times 19 \times 3^6 \times 6! \\ &\equiv (1 \times 2 \times 4 \times 5 \times 7 \times 8) \times (10 \times 11 \times 13 \times 14 \times 16 \times 17) \times 19 \times 3^6 \times 6! &\pmod 9\\ &\equiv (1 \times 2 \times 4 \times 5 \times 7 \times 8)^2 \times 19 \times 3^6 \times 6! &\pmod 9 \end{aligned} \]

所以可以暴力求第一个循环节,再通过快速幂求出所有循环节的乘积,最后暴力处理余下的项即可。

模板

#include <cstdio>
using namespace std;

typedef long long ll;

ll n, m, p;

ll exgcd(ll a, ll b, ll &x, ll &y)
{
	if (b == 0)
	{
		x = 1, y = 0;
		return a;
	}
	exgcd(b, a % b, x, y);
	ll t = x;
	x = y;
	y = t - a / b * y;
}

ll fpow(ll a, ll b, ll p)
{
	ll res = 1;
	while (b)
	{
		if (b & 1)
			res = res * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return res;
}

ll inv(ll a, ll p)
{
	ll x, y;
	exgcd(a, p, x, y);
	x = (x % p + p) % p;
	return x;
}

ll fac(ll n, ll p, ll k)
{
	if (n == 0)
		return 1;
	ll res = 1;
	for (int i = 2; i <= k; i++)
		if (i % p != 0)
			res = res * i % k;
	res = fpow(res, n / k, k);
	for (int i = 2; i <= n % k; i++)
		if (i % p != 0)
			res = res * i % k;
	return res * fac(n / p, p, k) % k;
}

ll C(ll n, ll m, ll p, ll k)
{
	if (n < m)
		return 0;
	ll a = fac(n, p, k), b = fac(m, p, k), c = fac(n - m, p, k);
	ll cnt = 0;
	for (ll i = p; i <= n; i *= p)
		cnt += n / i;
	for (ll i = p; i <= m; i *= p)
		cnt -= m / i;
	for (ll i = p; i <= n - m; i *= p)
		cnt -= (n - m) / i;
	return a * inv(b, k) % k * inv(c, k) % k * fpow(p, cnt, k) % k;
}

ll crt(ll n, ll mod)
{
	return n * (p / mod) % p * inv(p / mod, mod) % p;
}

ll exlucas()
{
	ll t = p, ans = 0;
	for (ll i = 2; i * i <= t; i++)
	{
		if (t % i == 0)
		{
			ll val = 1;
			while (t % i == 0)
				val *= i, t /= i;
			ans = (ans + crt(C(n, m, i, val), val)) % p;
		}
	}
	if (t > 1)
		ans = (ans + crt(C(n, m, t, t), t)) % p;
	return ans;
}

int main()
{
	scanf("%lld%lld%lld", &n, &m, &p);
	printf("%lld\n", exlucas());
	return 0;
}

标签:lfloor,frac,bmod,定理,扩展,times,choose,卢卡斯,ll
来源: https://www.cnblogs.com/lingspace/p/extended-lucas-theorem.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有