卢卡斯定理及其证明
结论#
Code
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define int long long
using namespace std;
int n,m,p,t,fac[105000];
int inv(int b,int q)//求逆元,费马小定理
{
int ans = 1;
for( ;q;q >>= 1,b = b*b%p)
{
if( q%2 != 0 )
ans = ans*b%p;
}
ans %= p;
return ans;
}
int C(int n,int m)
{
if( m > n )
return 0;
return fac[n]*inv((fac[m]*fac[n-m])%p,p-2)%p;
}
int Lucas(int n,int m)
{
if( m == 0 )
return 1;
return (Lucas(n/p,m/p)*C(n%p,m%p))%p;
}
signed main()
{
cin >> t;
for(int i = 1;i <= t; i++)
{
cin >> n >> m >> p;
fac[0] = 1;;
for(int i = 1;i <= p; i++)//预处理阶乘
{
fac[i] = fac[i-1]*i;
fac[i] %= p;
}
printf("%lld\n",Lucas(n+m,m));
}
return 0;
}
证明#
引理一#
证明:
引理二#
证明:
二项式定理:
其中,等号右侧叫做等号左侧的二次展开式。
先进行二项式展开
根据引理一
证明#
又因为
所以
取两边 次项的系数,因为 ,所以对于等式右边最多只有一种情况满足
作者:白简
出处:https://www.cnblogs.com/baijian0212/p/lucas.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异