首页 > 其他分享 >lucas定理 学习笔记

lucas定理 学习笔记

时间:2023-05-25 20:23:07浏览次数:35  
标签:inv return lucas 定理 样例 笔记 LL mod

lucas定理 学习笔记

目录

介绍

lucas定理用于解决形如 \(C_n^m \mod p (p\in prime)\) 的问题。

设 \(n,m\) 用 \(p\) 进制来表示为:\((n_an_{a-1}\cdots n_0)_p , (m_am_{a-1}\cdots m_0)_p\)

则:

\[C_n^m = C_{n_a}^{m_a}*C_{n_{a-1}}^{m_{a-1}}\cdots C_{n_0}^{n_0} \]

例如下面这道题 oj

combination

题目描述

LMZ有n个不同的基友,他每天晚上要选m个一起玩,而且要求每天晚上的选择都不一样。那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值。(1<=m<=n<=200,000,000)

输入格式

第一行一个整数t,表示有t组数据。(t<=200) 接下来t行每行两个整数n, m,如题意。

输出格式

T行,每行一个数,为C(n, m) mod 10007的答案。

样例

输入样例1

4
5 1
5 2
7 3
4 2

输出样例2

5
10
35
6

分析

显然,答案就是:\(C_n^m \mod 10007\)

但是我们的 \(fac[] , inv[]\) 开不了200,000,000,

所以我们就可以用 lucas 定理减小空间

code

#include <bits/stdc++.h>
#define LL long long
#define fu(x , y , z) for (int x = y ; x <= z ; x ++)
#define fd(x , y , z) for (int x = y ; x >= z ; x --)
using namespace std;
const int mod = 10007;
LL fac[mod + 5] , inv[mod + 5] , n , m;
LL ksm (LL x , LL y) {
    if(!y)
        return 1;
    long long z = ksm (x , y / 2);
    z = z * z % mod;
    if (y & 1)
        z = z * x % mod;
    return z; 
}
void pre () {
    fac[0] = fac[1] = 1;
    for(int i = 2 ; i <= mod - 1 ; i++)
        fac[i] = fac[i - 1] * i % mod;
    inv[mod - 1] = ksm (fac[mod - 1] , mod - 2);
    for (int i = mod - 2 ; i >= 0 ; i --)
        inv[i] = inv[i + 1] * (i + 1) % mod;
}
LL C (LL x , LL y) {
    if (x < y) return 0;
    if (!y || x == y) return 1;
    return fac[x] * inv[y] % mod * inv[x - y] % mod;
}
LL lucas (LL x , LL y) {
    if (x < y) return 0;
    if (!y) return 1;
    if (x < mod && y < mod) return C (x , y);
    return lucas (x / mod , y / mod) * C (x % mod , y % mod) % mod;
}
int main () {
    pre ();
    int T;
    scanf ("%d" , &T);
    while (T --) {
        scanf ("%lld%lld" , &n , &m);
        printf ("%lld\n" , lucas (n , m));
    }
}

扩展lucas

未完待续

标签:inv,return,lucas,定理,样例,笔记,LL,mod
From: https://www.cnblogs.com/2020fengziyang/p/17432748.html

相关文章

  • PMP 学习笔记(三)
    项目范围:为交付具有规定特性与功能的产品、服务或成果而必须完成的工作。项目范围有时也包括产品范围 预测型项目在每次迭代中,都会重复开展三个过程:收集需求、定义范围、创建WBS。 敏捷型项目中每次迭代中,都会重复开张两个过程:确认范围、控制范围。 对于需求不断变化、风险大或不......
  • 第一周 python基本语法 笔记
    写在前面的话:由于已经学习了c和c++,所以主要记录了与c/c++不同的地方一:基础知识1:严格缩进,单引号与双引号功能相同2:字符串的序号  字符串的序号可以用两种方式表示  -5-4-3-2-1  我喜欢编程  0  1 2 3 43:使用[]获取字符串的一个或多个字符   索引......
  • 笔记
    判断素数:#include<iostream>#include<math.h>usingnamespacestd;boolsu(intn){ inti=2; if(n==1) returnfalse; for(i=2;i<=sqrt(n);i++){ if(n%i==0) break; } if(i>sqrt(n)) returntrue;else returnfalse;}埃氏筛:boolisnp[M......
  • 〈数据库设计入门经典〉之第一章笔记
        现在,来写一下我看了前三章的体验吧!GO! 第一章数据库建模的过去与现在    呼呼,这一章基本都是在讲一些概念性的东西,所以,应该也没什么感想可写,那就再摘一点“苹果”来分享好了,Ready?GO!数据库:数据库是信息的集合——较为相关的信息和组织良好的信息。数据库由在安......
  • 《数据库设计入门经典》之第二章笔记
        上一次我摘了些第一章的内容,整理成了笔记,不知道对大家有没有点帮助啊,呵呵...第一章主要是讲了些概念上的东西,让大家对基本的概念有点理解,没有摘完全,只是选了我觉得有概括性的语句。现在,来写写第二章的笔记吧,Ready??GO!     第二章 工作场所中的数据库建模   ......
  • 《数据库设计入门经典》之第三章笔记
        上一次写了一点第二章的笔记,强调了在做数据库模型的设计时要注意“人”的作用,这一次,来说点正题。第三章的主题目是:数据库建模构件块,看过了以后觉得有些还是在讲数据库的概念性东西,不过,就算是学过了也还是要看一遍,我们总是容易高估自己的记忆,其实很多时候,一些很基础的东西你......
  • 《软件测试》读书笔记(持续更新)
    文章目录#第一部分软件测试综述##第一章软件测试的背景###1.1臭名昭著的软件错误用例研究###1.2软件缺陷是什么####1.2.1软件失败的术语确实严重,甚至是危险的情况:故障(fault)、失败(failure)、缺点(defect)不那么尖锐,主要指未按预料运行,而不指全部失败:异常(anomaly)、事件,插曲(inc......
  • 2.Redis的安装与配置-动力节点Redis7笔记
    2Redis的安装与配置这里是要将Redis安装到Linux系统中。2.1Redis的安装2.1.1克隆并配置主机修改主机名:/etc/hostname修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens332.1.2安装前的准备工作2.1.2.1安装gcc由于Redis是由C/C++语言编写的,而从官网下载的Redis......
  • Redis的安装与配置-动力节点最全Redis7笔记
    ##【动力节点】Redis入门到高级教程,全网最新最全redis缓存教程,redis百科大全2Redis的安装与配置这里是要将Redis安装到Linux系统中。2.1Redis的安装2.1.1克隆并配置主机修改主机名:/etc/hostname修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens332.1.2安装前的......
  • Java笔记(八):单例模式
    懒汉式懒汉式单例模式在第一次调用的时候进行实例化。1.适用于单线程环境(不推荐)此方式在单线程的时候工作正常,但在多线程的情况下就有问题了。如果两个线程同时运行到判断instance是否为null的if语句,并且instance的确没有被创建时,那么两个线程都会创建一个实例,此时类型Singlet......