码迷,mamicode.com
首页 > 其他好文 > 详细

Lucas定理

时间:2018-07-10 20:09:14      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:for   printf   define   getc   code   quick   oid   n+2   quic   

Lucas定理

大意:给定\(n,m,p\),求\(C_{m+n}^n\%p\)

数据范围:\(1 \le n,m,p \le 10^5\),保证\(p\)为质数


Code:

#include <cstdio>
#define ll long long
const int N=100000;
ll p,fac[N+20];
ll quick_pow(ll d,ll k)
{
    ll f=1;
    while(k)
    {
        if(k&1) f=f*d%p;
        d=d*d%p;
        k>>=1;
    }
    return f;
}
void init(ll k)
{
    fac[0]=fac[1]=1;
    for(ll i=2;i<=k;i++)
        fac[i]=fac[i-1]*i%p;
}
ll getC(ll n,ll m)
{
    return n>m?0:fac[m]*quick_pow(fac[m-n],p-2)%p*quick_pow(fac[n],p-2)%p;
}
ll lucas(ll n,ll m)
{
    return getC(n%p,m%p)*(n/p?lucas(n/p,m/p):1)%p;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll n,m;
        scanf("%lld%lld%lld",&n,&m,&p);
        init(m+n);
        printf("%lld\n",lucas(m,m+n));
    }
    return 0;
}

2018.7.10

Lucas定理

标签:for   printf   define   getc   code   quick   oid   n+2   quic   

原文地址:https://www.cnblogs.com/ppprseter/p/9290931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!