首页 > 其他 > 详细

组合数取模(lukas)板子

时间:2021-05-02 21:45:15      阅读:29      评论:0      收藏:0      [点我收藏+]

求 C(n,m)%mo

#include<bits/stdc++.h>
#define re register int
#define mo 10007
#define ll long long
#define N 200000010
using namespace std;
ll t;
ll inv(ll d,ll z)
{
    ll ans=1;
    while(z)
    {
        if(z&1)
            ans=ans*d%mo;
        z>>=1;
        d=d*d%mo;
    }
    return ans;
}
ll C(ll a,ll b)
{
    if(a<b)
        a+=mo;
    ll up=1,down=1;
    for(re i=a-b+1;i<=a;i++)
        up=up*i%mo;
    for(re i=2;i<=b;i++)
        down=down*i%mo;
    return up*inv(down%mo,mo-2)%mo;
}
ll lucas(ll n,ll m)
{
    if(m>n)
        return 0;
    if(m==0||n==0)
        return 1;
    return lucas(n/mo,m/mo)*C(n%mo,m%mo)%mo;
}
int main()
{
    scanf("%lld",&t);
    ll m,n;
    while(t--)
    {
        scanf("%lld%lld",&n,&m);
        printf("%lld\n",lucas(n,m));
    }
    return 0;
}

组合数取模(lukas)板子

原文:https://www.cnblogs.com/WindZR/p/14726039.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!