首页 > 其他分享 >拓展卢卡斯定理 / exlucas

拓展卢卡斯定理 / exlucas

时间:2024-04-09 18:44:25浏览次数:25  
标签:frac int res 定理 return pk 卢卡斯 exlucas pi

恶心东西爬、、、

我们要求解一个 \(\binom{n}{m}\mod M\),\(M\) 是不太大的正整数,\(n,m\) 是可能比较大的正整数。

首先我们分解 \(M=\prod_{i=1}^kp_i^{x_i}\),我们对于每一个 \(i\in[1,k]\) 求出 \(\binom{n}{m}\mod p_i^{x_i}\),然后就会组成一个方程组,\(Ans\equiv\binom{n}{m}\pmod p_i^{x_i}\),因为模数显然互质,所以此时的 \(Ans\) 可以通过 CRT 求解。

问题是怎么求这个 \(\binom{n}{m}\mod p^k\) 呢,我们知道有 \(a\) 在 \(\mod p\) 意义下有逆元的充要条件是 \(a\bot p\),这个地方就显得不一定有逆元了,不能直接求解,我们考虑变形:

\[\binom{n}{m}\equiv\frac{n!}{m!(n-m)!}\equiv\frac{\frac{n!}{p^x}}{\frac{m!}{p^y}\frac{(n-m)!}{p^z}}p^{x-y-z}\pmod {p^k} \]

然后求解 \(\frac{n!}{p^x}\pmod {p^k}\),这个 \(x\) 尽量往大了取,先挑出 \(p\) 的倍数直接做。

\[\frac{n!}{p^x}\equiv p^{⌊\frac{n}{p}⌋}(⌊\frac{n}{p}⌋!)\prod_{i 不是 p 的倍数,i=1}^{n}i\pmod {p^k} \]

后面那一段其实是有一个长度为 \(p^k\) 的循环节的,手玩可得,好像是一个威尔逊定理的推论,所以我们可以拆开写 >w<

\[\frac{n!}{p^x}\equiv p^{⌊\frac{n}{p}⌋}(⌊\frac{n}{p}⌋!)(\prod_{i 不是 p 的倍数,i=1}^{p^k} i)^{⌊\frac{n}{p^k}⌋}(\prod_{i 不是 p 的倍数,i=p^k⌊\frac{n}{p^k}⌋}^{n}i)\pmod {p^k} \]

写成递归的函数形式,那么 \(f(n)\equiv\frac{n!}{p^x}\pmod p\),有下柿:

\[f(n)=f(⌊\frac{n}{p}⌋)(\prod_{i 不是 p 的倍数,i=1}^{p^k} i)^{⌊\frac{n}{p^k}⌋}(\prod_{i 不是 p 的倍数,i=p^k⌊\frac{n}{p^k}⌋}^{n}i)\pmod {p^k} \]

直接递归暴力做就行了谢谢喵,放回去原式,发现 \(\frac{\frac{n!}{p^x}}{\frac{m!}{p^y}\frac{(n-m)!}{p^z}}p^{x-y-z}\) 前面的分数部分可以做了,那么还差一个 \(p^{x-y-z}\) 的指数,这个东西显然是 \(f(n)\) 中省去的 \(p^{⌊\frac{n}{p}⌋}\) 的指数部分,可以直接累加这一部分。

然后终于他妈的做完了 /lh

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)

using namespace std;

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

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

int ksm(int a,int b,int p) {
	int res=1%p;
	for( ; b; b>>=1) {
		if(b&1) res=res*a%p;
		a=a*a%p;
	}
	return res;
}

int fac(int n,int pi,int pk) {
	if(!n) return 1;
	int res=1;
	up(i,2,pk) if(i%pi) res=res*i%pk;
	res=ksm(res,n/pk,pk);
	up(i,2,n%pk) if(i%pi) res=res*i%pk;
	return res*fac(n/pi,pi,pk)%pk;
}

int C(int n,int m,int pi,int pk) {
	int above=fac(n,pi,pk), l=fac(m,pi,pk), r=fac(n-m,pi,pk), k=0;
	for(int i=n; i; i/=pi) k+=i/pi;
	for(int i=m; i; i/=pi) k-=i/pi;
	for(int i=n-m; i; i/=pi) k-=i/pi;
	return above*inv(l,pk)%pk*inv(r,pk)%pk*ksm(pi,k,pk)%pk;
}

int exlucas(int n,int m,int p) {
	int ans=0, x=p, t=sqrt(x);
	up(i,2,t) if(x%i==0) {
		int mul=1;
		while(x%i==0) x/=i, mul*=i;
		ans=(ans+C(n,m,i,mul)*(p/mul)%p*inv(p/mul,mul)%p)%p;
	}
	if(x>1) ans=(ans+C(n,m,x,x)*(p/x)%p*inv(p/x,x)%p)%p;
	return ans; 
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n, m, p;
	cin >> n >> m >> p;
	cout << exlucas(n,m,p); 
	return 0;
}

标签:frac,int,res,定理,return,pk,卢卡斯,exlucas,pi
From: https://www.cnblogs.com/chelsyqwq/p/18124563

相关文章

  • 贝叶斯定理推导(Bayes's Theorem)
    这里用文氏图(Venn diagram)来推导一下贝叶斯定理。 假设A和B为两个不相互独立的事件。 交集(intersection): 上图红色部分即为事件A和事件B的交集。 并集(union):  由Venndiagram可以看出,在事件B已经发生的情况下,事件A发生的概率为事件A和事件B的交集除以事件B: ......
  • CF156D-Prufer序列、多项式定理
    link:https://codeforces.com/contest/156/problem/D题意:给一张无向简单图\(G\),问有多少种加边的方式,使得图联通,并且需要加的边最小。\(|E|,|V|\leq10^5\),对\(k\)取模前置知识应该是Prufer序列(这题应该是绕不开这个东西)对每个连通分支考虑答案,如果有\(k\)个连通分支,大小......
  • 中国剩余定理
    上午就磨着rec,直到在实验室搬完砖后与rec成功结合为recain,被进行了一场启发式教学题目p=8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229q=1264067497399......
  • 矩阵树定理求所有生成树的边权和
    把一条边\(w\)写成\(wx+1\),则生成树边权积的一次项就是答案。求逆:\((ax+b)^{-1}\equiv(-\frac{a}{b^2}x+\frac{1}{b})\pmod{x^2}\)Codeusingll=longlong;constintN=31;constintMOD=998244353;structPoly{ lla,b; Poly(lla=0,llb=0):a(a),......
  • MCA Trader打造低利息,稳定理想交易平台
    在当今金融市场的快速发展中,投资者们对交易平台和服务的要求日益提高。他们渴望找到一个既安全稳定又高效便捷的交易平台,以帮助他们实现投资目标。在这样的背景下,MCATrader应运而生,以其独特的优势和服务理念,成为了公众投资者的理想选择。MCATrader作为一个专门服务于公众投......
  • 鞅与停时定理小记
    赌博问题设\(X_i\)为第\(i\)轮赌博后的收益。根据常识,显然有\(E(X_i)=X_0=0\)离散时间鞅定义一组离散时间鞅为时间离散的随机过程\(\{X_0,X_1,X_2,...\}\),满足对于任意\(n\),都有\(|E(X_n)|<+\infty\),即取值是有限的。\(E(X_{n+1}-X_n|X_0,X_1,...,X_n)=0\),意思......
  • 度序列与Havel-Hakimi定理
    1.度序列度序列:若把图G所有顶点的度数排成一个序列s,则称s为图G的度序列。例如,如图所示无向图G1的度序列为s:2,5,4,3,3,1;或s':1,2,3,3,4,5;或s'':5,4,3,3,2,1。 其中序列s是按顶点序号排序的,序列s'是按度数非减顺序排列的,序列s''是按度数非......
  • 尼奎斯特定理中,码元速率和信道带宽的公式为什么是B=2W
    初接触通信知识之前一直无法理解码元速率和信道带宽的转换公式B=2W。直至今日,仔细查资料和思考后得到答案。固做此笔记。以做记录。首先,之前一直困扰我的问题,究其原因是因为我搞错了带宽和速率的关系。所以在此,我们必须要将带宽和速率的关系给搞明白。为了方便理解,这里我们只......
  • 欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理
     数据结构、算法总述:数据结构/算法C/C++-CSDN博客欧拉函数欧拉函数(Euler'stotientfunction)是一个与正整数n相关的数论函数,通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数intphi(intx){intres=x;for(inti=2;i<=x/i;i++)......
  • 运动规划_碰撞检测算法之分离轴定理
    运动规划:碰撞检测算法之分离轴定理附赠自动驾驶全套学习资料和量产经验:链接如上文所述,基于包围形的方法是一种粗略的碰撞检测方法,基于外接圆形的方法运算速度很快,但精度很差;基于轴对齐包围矩形(AABB)的方法适合本身就是矩形的物体,其运算速度非常快,但检测精度还是不够。1......