当前位置: 首页 > news >正文

P3807 【模板】卢卡斯定理

刷数论模板啦。。。

在正事之前发现了一个小知识:组合数有两种书写方式。一种是形如\(C_3^2\),另一种是形如\(\binom{3}{2}\)。这两者等价。

卢卡斯定理其实也简单的:

\[\binom{m}{n}=\binom{m \mod p}{n \mod p} \times \binom{\lfloor \frac{m}{p} \rfloor }{ \lfloor \frac{n}{p} \rfloor} \mod p\]

这是一种简单的表达式。

lucas定理可以求大\(n,m\)的组合数取模。

这是一种递归的算法。下取整的大部分我们可以再次递归缩小范围求解,而取模的部分我们直接暴力来做。

如何暴力?

组合数的定义式:

\[C_m^n=\frac{m!}{n!(m-n)!}\]

在模意义下我们就没除法了。所以我们就要用到乘法逆元了。

我们先预处理出这些阶乘,然后可以用任意一种方法来求这两个阶乘的逆元。暴力乘上去即可。

代码:

#include<cstdio>

const int maxn = 1000005;
#define ll long long
ll n, m, p;
ll frac[maxn];
ll pow_mod(ll x, ll y, ll p)
{
    ll ans = 1, base = x % p;
    while(y)
    {
        if(y & 1) ans = ans * base % p;
        base = base * base % p;
        y >>= 1;
    }
    return ans % p;
}
ll inv(ll x, ll p)
{
    return pow_mod(x, p - 2, p) % p;
}
ll C(ll x, ll y, ll p)
{
    if(x < y) return 0;
    return frac[x] * inv(frac[y], p) % p * inv(frac[x - y], p) % p;
}
ll lucas(ll x, ll y, ll p)
{
    if(y == 0) return 1;
    return C(x % p, y % p, p) * lucas(x / p, y / p, p) % p;
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%lld%lld%lld", &n, &m, &p);
        frac[0] = 1;
        for(int i = 1; i <= p; i++) frac[i] = frac[i - 1] * i % p;
        printf("%lld\n", lucas(n + m, n, p));
    }
    return 0;
}

转载于:https://www.cnblogs.com/Garen-Wang/p/9745873.html

相关文章:

  • windows server 2003 安全加固(一)
  • 算法-图和图算法
  • Totuial 01 java
  • Spring Vault 2.1 正式发布
  • 聊聊storm client的nimbus.seeds参数
  • 深入源码分析Java线程池的实现原理
  • 第15讲 | 深入区块链技术(七):哈希与加密算法
  • Babel配置的不完全指南
  • IP数据报
  • 过了技术面却在HR面被刷?必备40问!从容应对HR,斩获N多大厂offer!
  • 如何解决 Django 前后端分离开发的跨域问题
  • JSP学习-02隐式对象
  • R1 学习记录
  • 167. Two Sum II - Input array is sorted
  • 想用Unity3D引擎技术赚点钱的看过来
  • [PHP内核探索]PHP中的哈希表
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • CSS盒模型深入
  • Git的一些常用操作
  • HTTP请求重发
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Linux Process Manage
  • node 版本过低
  • PAT A1017 优先队列
  • spring cloud gateway 源码解析(4)跨域问题处理
  • springboot_database项目介绍
  • Vue ES6 Jade Scss Webpack Gulp
  • webpack入门学习手记(二)
  • WePY 在小程序性能调优上做出的探究
  • Yii源码解读-服务定位器(Service Locator)
  • 聚类分析——Kmeans
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 如何设计一个比特币钱包服务
  • 入手阿里云新服务器的部署NODE
  • 一些css基础学习笔记
  • 你对linux中grep命令知道多少?
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)(1.13) SiK无线电高级配置(六)
  • (33)STM32——485实验笔记
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)JPA - JQPL 实现增删改查
  • (正则)提取页面里的img标签
  • (转)用.Net的File控件上传文件的解决方案
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net 4.0发布后不能正常显示图片问题
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET delegate 委托 、 Event 事件
  • .net framework4与其client profile版本的区别
  • .NET 分布式技术比较
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net多线程总结