您的位置:首页 > 其它

CodeVS1631 组合数

2016-10-28 16:56 120 查看

点击传送

题解

  卢卡斯定理模板题

  卢卡斯定理组合数计算公式:

  Cmn%p=Cm%pn%pCm/pn/p

  当n和m小于p时,直接O(p)求出,递归计算即可

代码

//卢卡斯定理
#include <cstdio>
#define ll long long
#define p 100003
using namespace std;
ll N, M, fac[p+100];
ll init()
{
ll i;
scanf("%lld%lld",&N,&M);
fac[0]=1;
for(i=1;i<p;i++)fac[i]=fac[i-1]*i%p;
}
void exgcd(ll a, ll b, ll &x, ll &y)
{
ll xx, yy;
if(!b){x=1,y=0;return;}
exgcd(b,a%b,xx,yy);
x=yy;y=xx-a/b*yy;
}
ll inv(ll a)
{
ll x, y;
exgcd(a,p,x,y);
return (x+p)%p;
}
ll C(ll n, ll m)
{return m>n?0:fac
*inv(fac[m]*fac[n-m]%p)%p;}
ll lacus(ll n, ll m)
{return m?C(n%p,m%p)*lacus(n/p,m/p):1;}
int main()
{
init();
printf("%lld\n",lacus(N,M));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: