【基本解题思路】

将n个相同的元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m-1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序的m份,每个组依次按组序号分到对应位置的几个元素(可能是1个、2个、3个、4个、….),这样不同的插入办法就对应着n个相同的元素分到m组的一种分法,这种借助于这样的虚拟“档板”分配元素的方法称之为插板法。

【基本题型的变形(一)】

题型:有n个相同的元素,要求分到m组中,问有多少种不同的分法?

解题思路:这种问题是允许有些组中分到的元素为“0”,也就是组中可以为空的。对于这样的题,我们就首先将每组都填上1个,这样所要元素总数就m个,问题也就是转变成将(n+m)个元素分到m组,并且每组至少分到一个的问题,也就可以用插板法来解决。 (这里需要相加)

【基本题型的变形(二)】

题型:有n个相同的元素,要求分到m组,要求各组中分到的元素至少某个确定值S(s>1,且每组的s值可以不同),问有多少种不同的分法?

解题思路:这种问题是要求组中分到的元素不能少某个确定值s,各组分到的不是至少为一个了。对于这样的题,我们就首先将各组都填满,即各组就填上对应的确定值s那么多个,这样就满足了题目中要求的最起码的条件,之后我们再分剩下的球。这样这个问题就转变为上面我们提到的变形(一)的问题了,我们也就可以用插板法来解决。(这里是要减的)

至少一个的情况,与基本类型相同。

注意:此题是将m划分而不是将n划分,将m划分成n份,每份可以为0,带入第二种情况。只要理解这点此题就简单了。

题目相当于求n个数的和不超过m的方案数。

如果和恰好等于m,那么就等价于方程${x_1} + {x_2} + ... + {x_n} = m$的解的个数,利用插板法可以得到方案数为:

$C_{m + n - 1}^{n - 1} = C_{m + n - 1}^m$

现在就需要求不大于m的,相当于对i = 0,1...,m对$C_{n + i - 1}^i$求和,根据公式$C_n^k = C_{n - 1}^k + C_{n - 1}^{k - 1}$得

\[\begin{array}{*{20}{l}}
{C_{n - 1}^0 + C_n^1 + ... + C_{n + m - 1}^m}\\
{ = {\rm{ }}C_n^0 + C_n^1 + C_{n + 1}^2 + ... + C_{n + m - 1}^m}\\
{ = {\rm{ }}C_{n + m}^m}
\end{array}\]

现在就是要求$C_{n + m}^m\% p$,其中p是素数。

证明lucas定理一篇很好的博客:http://www.cnblogs.com/owenyu/p/6724560.html,是利用费马小定理证明的。

贴一个挺有用的证明:

lucas定理:

\[\left( \begin{array}{l}
n\\
m
\end{array} \right) = \prod\limits_{i = 0}^k {\left( \begin{array}{l}
{a_i}\\
{b_i}
\end{array} \right){\mathop{\rm modp}\nolimits} } \]

其中,

\[\begin{array}{l}
n = {({a_1}{a_2}{a_3}...{a_k})_p}\\
m = {({b_1}{b_2}{b_3}...{b_k})_p}
\end{array}\]

注:n,m不能大于10^5,不大于情况下用逆元的方法可以解决,如果大了就不能解决。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll n,m,p,t;
 5 ll mod_pow(ll x,ll n,ll p){
 6     ll res=1;
 7     while(n){
 8         if(n&1) res=res*x%p;
 9         x=x*x%p;
10         n>>=1;
11     }
12     return res;
13 }
14 ll comb(ll n,ll m,ll p){
15     if(n==m) return 1;
16     if(n<m) return 0;
17     if(m>n-m) m=n-m;
18
19     ll tn=1,tm=1;
20     while(m){
21         tn=tn*n%p;
22         tm=tm*m%p;
23         n--,m--;
24     }
25     return tn*mod_pow(tm,p-2,p)%p;
26 } //其实lucas就是comb的一种特殊形式,所以代码才这么像
27 ll lucas(ll n,ll m,ll p){
28     ll res=1;
29     while(m){
30         res=res*comb(n%p,m%p,p)%p;
31         n/=p;
32         m/=p;
33     }
34     return res;
35 }
36 int main(){
37     scanf("%lld",&t);
38     while(t--){
39         scanf("%lld%lld%lld",&n,&m,&p);
40         printf("%lld\n",lucas(n+m,m,p)%p);
41     }
42     return 0;
43 }

【基本解题思路】

n

个相同的元素排成一行,

n

个元素之间出现了(

n-1

)个空档,现在我们用(

m-1

)个

档板

插入(

n-1

个空档中,就把

n

个元素隔成有序的

m

份,每个组依次按组序号分到对应位置的几个元素(可能是

1

个、

2

个、

3

个、

4

个、

….

,这样不同的插入办法就对应着

n

个相同的元素分到

m

组的一种分法,这种借助于

这样的虚拟

档板

分配元素的方法称之为插板法。

转载于:https://www.cnblogs.com/elpsycongroo/p/6817016.html

[HDU3037]Saving Beans,插板法+lucas定理相关推荐

  1. ZOJ 3557 (插板法+Lucas定理)

    题意:从n数中选出m个数,要求任意两个数不相邻,求方案数题意:从n数中选出m个数,要求任意两个数不相邻,求方案数题意:从n数中选出m个数,要求任意两个数不相邻,求方案数 题解:n个数中取m个,则还剩下 ...

  2. hdu3037 Saving Beans

    题意:  给了n课不同的树,要求将 0,1,2,3,4,5,...m个松果,分别放在n棵树上的方案数有多少     总结:当选取得数含有0时,要转化,然而开始并不会组合数学太烂了 #include & ...

  3. Saving Beans HDU - 3037(卢卡斯定理)

    Saving Beans HDU - 3037(卢卡斯定理) 题意: 他们想知道有多少种方法可以在n树中保存不超过m个bean(它们是相同的). 现在他们求助于你,你应该给他们答案. 结果可能非常巨大 ...

  4. (lucas) Saving Beans

    题目: Although winter is far away, squirrels have to work day and night to save beans. They need plent ...

  5. 费马小定理+插板法 - Sum(HDU4704)

    传送门 Analysis 绝对是题目描述的问题 注意: 在这道题中1+1+2=41+1+2=41+1+2=4 和 1+2+1=41+2+1=41+2+1=4是两种不同的方案 但2+2=42+2=42+ ...

  6. HDU 3037 Saving Beans (Lucas法则)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3037 推出公式为C(n + m, m) % p. 用Lucas定理求大组合数取模的值 代码: #inc ...

  7. hdu3037 Lucas定理

    Lucas定理 Lucas(n,m,p)=c(n%p,m%p)* Lucas(n/p,m/p,p),其中lucas(n,m,p)=C(n,m)%p (这里的除号是整除) 证明--百度百科 题意:求n个 ...

  8. Lucas定理及组合数取模

    首先给出这个Lucas定理: 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] ...

  9. hdu 3037 Lucas定理

    题目可以转换成 x1+x2+--+xn=m 有多少组解,m在题中可以取0-m. x1+x2+...+xn = m的解的个数,利用插板法可以得到方案数为: (m+1)*(m+2)...(m+n-1) = ...

最新文章

  1. 南达科他州立大学计算机科学,关于举行南达科他州立大学Srinivas Janaswamy博士学术报告的通知...
  2. python读取excel一列-Python从Excel中读取日期一列的方法
  3. 【Java进阶】云存储-创建子模块作为第三方整合模块
  4. SpringMVC的视图解析器
  5. 深入了解Java 8日期和时间API
  6. H.264句法和语法总结 句法元素的分层结构
  7. JavaScript 需要清楚的10件事
  8. High performance find query using lean() in mongoose
  9. WebGIS中利用AGS JS+eCharts实现一些数据展示的探索
  10. android studio2.3.6,Android Studio 2.3 问题汇总 - 解决一切障碍,为了更好的时代
  11. 全网最简单Win10桌面美化教程,只需4步!!
  12. 电信计费综合管理系统
  13. 任意输入一个年份 判断是否为闰年
  14. 用js实现鼠标的小尾巴
  15. FairyGUI增益BUFF数值改变的显示
  16. jzoj. 1285. 奶酪厂
  17. 4G LTE各band对应的频率一览表
  18. WEB开启防调试模式
  19. 达梦DCA培训考试笔记
  20. 老人与海好词100英文带翻译_老人与海英文读后感100字

热门文章

  1. Apache shiro
  2. JavaScript多种跨域方式
  3. IT人 不要一辈子靠技术生存(转)
  4. SQL Server 变量名称的Collcation跟Instance还是跟当前DB?
  5. 图像处理基本概念——卷积,滤波,平滑
  6. python 3d绘图立方体_python绘制3D立方体
  7. 江阴南菁高考2021高考成绩查询,江阴8所四星级高中高考成绩公布 南菁高中本一进线率达到了92.97%...
  8. java交换数组元素_交换数组中的元素(Java)
  9. python基础课程第12章_流畅的python学习笔记-第12章
  10. vs cpp生成h文件_lib 和 dll 的区别、生成以及使用详解