Lucas 模版

Lucas 模版
C n m m o d    m o d ( m o d 是 素 数 ) C_n^m \mod mod (mod 是素数) Cnmmodmod(mod)

ll Lucas(ll n,ll m){
	if(!m) return 1;
	return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
}

exLucas 模版
C n m m o d    m o d ( m o d 可 以 不 是 素 数 ) C_n^m \mod mod (mod 可以不是素数) Cnmmodmod(mod)

ll qmod(ll a,ll b,ll mod){
	ll ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}

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

ll inv(ll a,ll mod)
{
    if(!a) return 0;
    ll x,y;
    exgcd(a,mod,x,y);
    return (x%mod+mod)%mod;
}

ll mul(ll n,ll pi,ll pk)
{
    if(!n) return 1ll;
    ll ans=1ll;
    if(n/pk)
    {
        for(ll i=2;i<pk;i++)
            if(i%pi) ans=ans*i%pk;
        ans=qmod(ans,n/pk,pk);       
    }
    for(ll i=2;i<=n%pk;i++)
        if(i%pi) ans=ans*i%pk;
    return ans*mul(n/pi,pi,pk)%pk;
} 

ll C(ll n,ll m,ll mod,ll pi,ll pk)
{
    if(m>n) return 0ll;
    ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk);
    ll k=0ll,ans;
    for(ll i=n;i;i/=pi) k+=i/pi;
    for(ll i=m;i;i/=pi) k-=i/pi;
    for(ll i=n-m;i;i/=pi) k-=i/pi;
    ans=a*inv(b,pk)%pk*inv(c,pk)%pk*qmod(pi,k,pk)%pk;
    return ans*(mod/pk)%mod*inv(mod/pk,pk)%mod;
}

ll exLucas(ll n,ll m,ll mod)
{
    ll ans=0;
    for(ll x=mod,i=2;i<=mod;i++)
        if(x%i==0)
        {
            ll pk=1;
            while(x%i==0) pk*=i,x/=i;
            ans=(ans+C(n,m,mod,i,pk))%mod;
        }
    return ans; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值