zoukankan      html  css  js  c++  java
  • Lucas定理--组合数取模

    Lucas定理是用来求 c(n,m) mod p,p为素数的值。

    C(n, m) % p = C(n / p, m / p) * C(n % p,m % p) % p 
    

    (Lucas(n,m,p)=C(n \% p,m \% p) imes Lucas(frac{n}{p},frac{m}{p},p))

    (inom{n}{m}=frac{n!}{m!(n-m)!})

    卢卡斯定理模板

    #include <cstdio>
    #include <iostream>
    #define ll long long
    using namespace std;
    ll pow(ll a,ll b,ll p){
        ll ans = 1; a %= p;
        while(b){
            if(b & 1)ans = ans * a % p;
            b >>= 1;
            a = a * a % p;
        }
        return ans;
    }
    ll inv(ll x, ll p){//x关于p的逆元,p为素数
        return pow(x, p - 2, p);
    }
    ll C(ll n, ll m, ll p){//求组合数C(n,m)%p
        if(n < m) return 0;
        ll up = 1, down = 1;//分子分母
        for(ll i = n - m + 1; i <= n; i++) up = up * i % p;
        for(ll i = 1; i <= m; i++) down = down * i % p;
        return up * inv(down, p) % p;
    }
    ll lucas(ll n, ll m, ll p){
        if(m == 0) return 1;
        return C(n % p, m % p, p) * lucas(n / p, m / p, p) % p;
    }
    int main(){
        ll n, m, p;
        scanf("%lld%lld%lld", &n, &m, &p);
        printf("%lld
    ", lucas(n, m, p));
        return 0;
    }
    
  • 相关阅读:
    SQL查看数据库中每张表的数据量和总数据量
    Asp.Net Mvc Area二级域名
    Asp.Net Mvc 整站Https
    Task 开始 停止
    最全省份城市生成代码
    代理
    反射和工厂模式
    枚举
    IO
    集合类(二)
  • 原文地址:https://www.cnblogs.com/Emcikem/p/11746942.html
Copyright © 2011-2022 走看看