# 数论-组合数+lacus定理

目录

  • 数论-组合数+lacus定理

    • 组合数计算
    • lacus定理-大组合数取模

数论-组合数+lacus定理

组合数计算

  • 为避免爆long long,\(20!\)就达到了long long 的范围,采用边乘边除的思想
ll C(ll n,ll m){
    if(n<m)return 0;
    ll ans=1;
    for(ll i=1;i<=m;i++)
        ans=ans*(n-m+i)/i;
    return ans;
}

lacus定理-大组合数取模

  • 卢卡斯定理:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p,适合p的范围在10^5且p为素数的情况
  • 费马小定理:当p为质数时候, a^(p-1)≡1(mod p), a*a^(p-2)≡1(mod p)
ll qpow(ll a,ll b){
    ll ans=1;
    a%=p;
    while(b){
        if(b&1)ans=ans*a%p;
        b>>=1;
        a=a*a%p
    }
    return ans;
}
ll C(ll n,ll m){
    if(n<m)return 0;
    ll ans=1;
    for(ll i=1;i<=m;i++)
        ans=ans*((n-m+i)%p*qpow(i,p-2)%p)%p;//费马小定理求逆元
    return ans;
}

ll lacus(ll n,ll m){
    if(m==0)
        return 1;
    return (lacus(n/p,m/p)*C(n%p,m%p))%p;
}

原文地址:https://www.cnblogs.com/sstealer/p/11248668.html

时间: 2024-10-16 13:34:44

# 数论-组合数+lacus定理的相关文章

ACM数论中相关定理(不断更新)

费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p).即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1. 费马大定理,又被称为“费马最后的定理”,由法国数学家费马提出.它断言当整数n >2时,关于x, y, z的方程 x^n + y^n = z^n 没有正整数解.被提出后,经历多人猜想辩证,历经三百多年的历史,最终在1995年被英国数学家安德鲁·怀尔斯证明. 中国剩余定理的结论: 令任意固定整数

数论 --- 同余定理

声明:以下文章是借鉴了别人的再加上自己补充后的,转载请注明! 一.同余 对于整数除以某个正整数的问题,如果只关心余数的情况,就产生同余的概念. 定义1 用给定的正整数m分别除整数a.b,如果所得的余数相等,则称a.b对模m同余,记作a≡b(mod m),如 56≡0 (mod 8). 举个例子: 3%2=1 5%2=1 则有: (5-3)%=0 [同余性质] 1) 自反性 2) 传递性 3) 对称性 4) 若 a ≡ b (mod m), c ≡ d (mod m) 则 a+b ≡ b+ d(m

数论篇7——组合数 &amp; 卢卡斯定理(Lucas)

组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\right) !}$ 性质1:$C^{m}_{n}=C_{n}^{n-m}$ 性质2:$C^{m}_{n}=C^{m-1}_{n-1}-i+C^{m}_{n-1}$ 打表递推 根据性质2:$C^{m}_{n}=C^{m-1}_{n-1}+C^{m}_{n-1}$ 组合数算出来特别大,往往都会要求取余,这里取

ACM数论之旅10---大组合数-卢卡斯定理(在下卢卡斯,你是我的Master吗?(。-`ω&#180;-) )

记得前几章的组合数吧 我们学了O(n^2)的做法,加上逆元,我们又会了O(n)的做法 现在来了新问题,如果n和m很大呢, 比如求C(n, m) % p  , n<=1e18,m<=1e18,p<=1e5 看到没有,n和m这么大,但是p却很小,我们要利用这个p (数论就是这么无聊的东西,我要是让n=1e100,m=1e100,p=1e100你有本事给我算啊(°□°),还不是一样算不出来) 然后,我们著名的卢卡斯(Lucas)在人群中站了出来(`?д?´)说:“让老子来教你这题” 卢卡斯说:

HDU 3037 Saving Beans (数论,Lucas定理)

题意:问用不超过 m 颗种子放到 n 棵树中,有多少种方法. 析:题意可以转化为 x1 + x2 + .. + xn = m,有多少种解,然后运用组合的知识就能得到答案就是 C(n+m, m). 然后就求这个值,直接求肯定不好求,所以我们可以运用Lucas定理,来分解这个组合数,也就是Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p). 然后再根据费马小定理就能做了. 代码如下: 第一种: #pragma comment(linker, "/STACK:10240

[Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)

题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 在很久很久以前,有个臭美国王.一天,他得到了一件新衣,于是决定巡城看看老百姓的反应(囧).于是他命令可怜的宰相数一下他有多少种巡城方案. 城市是一个N*M的矩形,(N+1)*(M+1)条街把城市分成了N*M块.国王从左下角出发,每次只能向右或向上走,右上角是终点. 请你帮帮可怜的宰相. Input

【组合数+Lucas定理】2017多校训练七 HDU 6129 Just do it

http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b 重复这样的操作m次,每次都是从上次求出的序列a得到一个新序列b 给定初始的序列,求重复m次操作后得到的序列 [思路] 假定n=5,我们模拟一次可以发现,经过m次操作后a1在b1......bn中出现的次数为: m=0: 1 0 0 0 0 m=2: 1 2 3 4 5 m=3: 1 3 6 10 1

LightOJ1214 Large Division 基础数论+同余定理

Given two integers, a and b, you should check whether a is divisible by b or not. We know that an integer a is divisible by an integer b if and only if there exists an integer c such that a = b * c. Input Input starts with an integer T (≤ 525), denot

数论-组合数

组合数一: 组合数范围小,询问多,可以采用预处理方式,把所有的都处理出来 题目: 给定nn组询问,每组询问给定两个整数a,ba,b,请你输出Cba mod (109+7)Cab mod (109+7)的值. 输入格式 第一行包含整数nn. 接下来nn行,每行包含一组aa和bb. 输出格式 共nn行,每行输出一个询问的解. 数据范围 1≤n≤100001≤n≤10000,1≤b≤a≤20001≤b≤a≤2000 输入样例: 3 3 1 5 3 2 2 输出样例: 3 10 1 1 #include