卢卡斯定理

卢卡斯定理:解决一类组合数取模问题

A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。

则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同余

即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 

这个是单独处理n!的情况,当然C(n,m)就是n!/(m!*(n-m)!),每一个阶乘都用上面的方法处理的话,就是Lucas定理了,注意这儿的p是素数是有必要的。

Lucas最大的数据处理能力是p在10^5左右,不能再大了,hdu 3037就是10^5级别的!

对于大组合数取模,n,m不大于10^5的话,用逆元的方法,可以解决。对于n,m大于10^5的话,那么要求p<10^5,这样就是Lucas定理了,将n,m转化到10^5以内解。

 

模板:

/*
Lucas定理 C(n,m)%p(p为素数)
C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[-2])*....*C(a[0],b[0])模p同余
a,b 是n,m在p进制下的数
有的推公式: (C(n%p,m%p,p)*Lcs(n/p,m/p,p))%p;
关键是求 C(n%p,m%p,p) 递归会很慢 for的话会爆掉
这里用一个定理:a/b%p <--> a*x%p  x为b在b%p下的逆元
再来一个定理:x=b^(p-2)   x为b在%p下的逆元  p为素数
然后预处理一下阶乘就ok了 
*/
#include<iostream>
#include<cstdio>
#include<cstring>#define N 1001using namespace std;
int f[N];int Mi(int a,int b,int p)
{int res=1;while(b){if(b&1) res=res*a%p;b>>=1;a=a*a%p;}return res;
}int C(int n,int m,int p)
{if(m>n)return 0;return  f[n]*Mi(f[m]*f[n-m],p-2,p)%p;
}int Lus(int n,int m,int p)
{if(m==0) return 1;return (C(n%p,m%p,p)*Lus(n/p,m/p,p))%p;
}int main()
{int n,m,p;scanf("%d%d%d",&n,&m,&p);f[0]=1;for(int i=1;i<=p;i++)f[i]=f[i-1]*i%p;printf("%d\n",Lus(n,m,p));
}

 

hdu3037 http://acm.hdu.edu.cn/showproblem.php?pid=3037

题目大意:求在n棵树上摘不超过m颗豆子的方案,结果对p取模。

思路:题目可以转换成  x1+x2+……+xn=m 有多少组解,m在题中可以取0~m。

利用插板法可以得出x1+x2+……+xn=m解的个数为C(n+m-1,m);

则题目解的个数可以转换成求   sum=C(n+m-1,0)+C(n+m-1,1)+C(n+m-1,2)……+C(n+m-1,m)

利用公式C(n,r)=C(n-1,r)+C(n-1,r-1)  == >  sum=C(n+m,m)。

就是要求C(n+m,m)%p。

#include<iostream>
#include<cstdio>
#include<cstring>#define N 100007using namespace std;
long long f[N];long long Mi(long long a,long long b,long long p)
{long long res=1;while(b){if(b&1) res=res*a%p;b>>=1;a=a*a%p;}return res;
}long long C(long long n,long long m,long long p)
{if(m>n)return 0;return  f[n]*Mi(f[m]*f[n-m],p-2,p)%p;
}long long Lcs(long long n,long long m,long long p)
{if(m==0)return 1;return (C(n%p,m%p,p)*Lcs(n/p,m/p,p))%p;
}int main()
{long long n,m,p;long long t;        cin>>t;while(t--){cin>>n>>m>>p;f[0]=1;for(long long i=1;i<=p;i++)f[i]=f[i-1]*i%p;printf("%lld\n",Lcs(n+m,m,p));}return 0;
}
Code

 

转载于:https://www.cnblogs.com/L-Memory/p/7352397.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内核理解

在纯技术方面&#xff0c;内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件&#xff0c;并充当底层的驱动程序&#xff0c;对系统中的各种设备和组件。内核启动init程序作为第一个进程&#xff0c;该进程负责进一步的系统初始化操作&#xff0c;并显示登…

loadrunner中对https证书的配置

1、准备好网站的证书&#xff0c;一般证书是cer格式&#xff1b; 2、因为loadrunner只支持pem格式的证书&#xff0c;所以要将证书转换格式&#xff0c;利用openssl工具&#xff1b;&#xff08;或者直接让开发提供pem格式的证书&#xff09;3、得到pem格式的证书之后&#xff…

Android 9 Pie震撼来袭 同步登陆WeTest

作者&#xff1a;We Test小编商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。原文链接&#xff1a;wetest.qq.com/lab/view/40…WeTest 导读2018年8月7日&#xff0c;Google对外发布最新 Android 9.0 正式版系统&#xff0c;并宣布系统版本Android P 被正…

Datapath综合代码规范(Verilog)

一、一般准则 1、有符号数运算 利用类型“signed”完成有符号数运算&#xff0c;而不是用无符号数模拟有符号数运算。这样可以得到更好的QoR。在资源报告中检查操作数的类型和大小。 2、符号/零扩展 尽量不要手动扩展。verilog利用signed/unsigned会自动完成扩展。这样代码可…

Linux下V4L2编程小结

http://www.360doc.com/content/12/0318/16/532901_195392228.shtml :davind dm365linux移植 http://www.embedhq.org/html/jsbw/2010/0425/390.html :Linux下V4L2编程小结

百(垃)度(圾)之星初赛B hdu6114

Chess 题意&#xff1a;中文题 思路&#xff1a;其实就是在n个格子上放m个棋子&#xff08;n>m&#xff09;&#xff08;xjb套Lucas的板子... AC代码&#xff1a; #include "iostream" #include "string.h" #include "stack" #include "…

variable 'xxx' unsafe in 'case'的处理

问题描述&#xff1a; case get(?Player_LoopTaskInfo) of{TargetCnt, TaskStar, TaskExp} ->ok;_ ->throw("not_found_loop_task_info") end 在case语句中&#xff0c;这样写&#xff0c;编译时&#xff0c;会提示变量unsafe&#xff0c;解决编译器报错的…

SDUT 3347 数据结构实验之数组三:快速转置

数据结构实验之数组三&#xff1a;快速转置 Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description 转置运算是一种最简单的矩阵运算&#xff0c;对于一个m*n的矩阵M( 1 < m < 10000,1 < n < 10000 )&#xff0c;它的转置矩阵T是一个n*m的矩阵&…

linux设备和驱动加载的先后顺序

Linux驱动先注册总线&#xff0c;总线上可以先挂device&#xff0c;也可以先挂driver&#xff0c;那么究竟怎么控制先后的顺序呢。 Linux系统使用两种方式去加载系统中的模块&#xff1a;动态和静态。 静态加载&#xff1a;将所有模块的程序编译到Linux内核中&#xff0c;由do_…

CMOS 图像传感器——Skipping 和 Binning 模式

在通常的CMOS读取方式中&#xff0c;由于像素读取规模的差异&#xff0c;不同的分辨率对应不同的帧率。在通道带宽固定的前提下&#xff0c;想要提高帧率就要考虑是否需要缩小视野&#xff08;外圈裁切&#xff09;。若不希望视野缩小&#xff0c;需要减少采样的分辨率。 常用的…

DAVINCI DM365-368中 linux-2.6.32的移植

http://www.360doc.com/content/12/0318/16/532901_195392228.shtml 很详细的一篇文章&#xff0c;在此感谢了&#xff01; http://www.rosoo.net/a/201001/8316.html DM系列芯片外设详细介绍

Jacoco--测试覆盖率工具

介绍JaCoCo&#xff08;Java Code Coverage&#xff09;是一种分析单元测试覆盖率的工具&#xff0c;使用它运行单元测试后&#xff0c;可以给出代码中哪些部分被单元测试测到&#xff0c;哪些部分没有没测到&#xff0c;并且给出整个项目的单元测试覆盖情况百分比&#xff0c;…

HTML 标记大全参考手册

1.文件结构 文件类型 <HTML></HTML> &#xff08;放在文档的开头与结尾&#xff09; 文件主题 <TITLE></TITLE> &#xff08;必须放在「文头」区块内&#xff09; 文头 <HEAD></HEAD> &#xff08;描述性资料&#xff0c;如「主题」&#…

APB协议学习

APB(Advanced Peripheral Bus) 1、APB的概述与特点 APB主要用于低带宽的周边外设之间的连接&#xff0c;例如UART、1284等&#xff0c;它的总线架构不像AHB支持多个主模块&#xff0c;在APB里面唯一的主模块就是APB 桥。其特性包括&#xff1a;两个时钟周期传输&#xff1b;无…

私有协议栈开发

通信协议从广义上区分&#xff0c;可以分为公有协议和私有协议。由于私有协议的灵活性&#xff0c;它往往会在某个公司或者组织内部使用&#xff0c;按需定制&#xff0c;也因为如此&#xff0c;升级起来会非常方便&#xff0c;灵活性好。绝大多数的私有协议传输层都基于TCP/IP…

制作NFS

最近学习NFS&#xff0c;用本地测试. 以下是我的测试过程 环境 ubuntu 10.4 vm 7.1 终端 ifconfig 得到 ubuntu资料 INET ADDR 192.168.0.4 BCAST 192.168.0.255 MASK 255.255.255.0 一 安装NFS $ sudo apt-get install nfs-kernel-server $ sudo apt-get install nfs…

【笔记篇】C#笔记2

返回目录&#xff1a;目录请戳这里~ C#数组 基本概念不提。。int[] a; bool[] b new bool[10]; float[] c {0.5, 57.0, 233.3, 12345.67 }; double[] d new double[/*3*/]{233.33, 1926.0817, 4396.0 }; 然后数组和指针有很大的不同。。。 Array类不会用…… 有多维数组和…

SFB 项目经验-51-某上市企业2千人Exchange 2013升级2016高可用之伤01

SFB 项目经验-51-某上市企业2千人Exchange 2013升级2016高可用之伤01&#xff08;带病撰写项目实战笔记&#xff09;问题描述&#xff1a;2000人企业使用Exchange 2013邮件服务器标准版&#xff0c;n年!1&#xff09;问题1&#xff1a;标准版仅支持5个邮箱数据库。2&#xff09…

数字图像处理——2D降噪

图像降噪处理主要分为2D&#xff08;空域&#xff09;与3D降噪&#xff08;时域/多帧&#xff09;&#xff0c;而2D降噪由于相关的实现算法丰富&#xff0c;效果各异&#xff0c;有着丰富的研究价值。理解2D降噪算法的流程&#xff0c;也对其他的增强算法有很大的帮助&#xff…

项目开发(Require + E.js)

最近在做的几个项目&#xff0c;分别用了不同的框架跟方式&#xff0c;有个H5的项目&#xff0c;用了vue框架&#xff0c; 这个项目我还没有正式加入进去&#xff0c; 等手头的这个项目完成就可以去搞vue了&#xff0c; 现在手头的这个项目是一个招聘的项目&#xff0c; 用到了…