【基本解题思路】

将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,不大于情况下用逆元的方法可以解决,如果大了就不能解决。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,p,t;
ll mod_pow(ll x,ll n,ll p){
ll res=;
while(n){
if(n&) res=res*x%p;
x=x*x%p;
n>>=;
}
return res;
}
ll comb(ll n,ll m,ll p){
if(n==m) return ;
if(n<m) return ;
if(m>n-m) m=n-m; ll tn=,tm=;
while(m){
tn=tn*n%p;
tm=tm*m%p;
n--,m--;
}
return tn*mod_pow(tm,p-,p)%p;
} //其实lucas就是comb的一种特殊形式,所以代码才这么像
ll lucas(ll n,ll m,ll p){
ll res=;
while(m){
res=res*comb(n%p,m%p,p)%p;
n/=p;
m/=p;
}
return res;
}
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&m,&p);
printf("%lld\n",lucas(n+m,m,p)%p);
}
return ;
}

【基本解题思路】

n

个相同的元素排成一行,

n

个元素之间出现了(

n-1

)个空档,现在我们用(

m-1

)个

档板

插入(

n-1

个空档中,就把

n

个元素隔成有序的

m

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

1

个、

2

个、

3

个、

4

个、

….

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

n

个相同的元素分到

m

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

这样的虚拟

档板

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

[HDU3037]Saving Beans,插板法+lucas定理的更多相关文章

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

    题意:问用不超过 m 颗种子放到 n 棵树中,有多少种方法. 析:题意可以转化为 x1 + x2 + .. + xn = m,有多少种解,然后运用组合的知识就能得到答案就是 C(n+m, m). 然后 ...

  2. hdu3037 Saving Beans(Lucas定理)

    hdu3037 Saving Beans 题意:n个不同的盒子,每个盒子里放一些球(可不放),总球数<=m,求方案数. $1<=n,m<=1e9,1<p<1e5,p∈pr ...

  3. HDU3037 Saving Beans(Lucas定理+乘法逆元)

    题目大概问小于等于m个的物品放到n个地方有几种方法. 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m. 这个方程的非负整数解个 ...

  4. hdu3037 Saving Beans

    Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pro ...

  5. 3037 插板法+lucas

    先说下lucas定理 1)Lucas定理:p为素数,则有: (2)证明: n=(ak...a2,a1,a0)p = (ak...a2,a1)p*p + a0 =  [n/p]*p+a0 (注意 这里( ...

  6. HDU3037Saving Beans(组合数+lucas定理)

    Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...

  7. Saving Beans(hud3037)

    Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. hdu 3037 Saving Beans Lucas定理

    Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

随机推荐

  1. jQuery中通过JSONP来跨域获取数据的三种方式

    第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...

  2. php类和对象(一)

    对象:任何东西都可以称为对象,类实例化出来的东西类:对所有同类的对象抽象出来的东西 Info: Code,Name,Sex,Nation,Birthday对象:一条具体的信息 p001 张三 男 汉族 ...

  3. Python OOP(2)-static method,class method and instance method

    静态方法(Static Method): 一种简单函数,符合以下要求: 1.嵌套在类中. 2.没有self参数. 特点: 1.类调用.实例调用,静态方法都不会接受自动的self参数. 2.会记录所有实 ...

  4. Python 列表解析list comprehension和生成表达式generator expression

    如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression) (1)list ...

  5. Java InetAddress.getByAddress()的使用

    import java.net.*; public class NetDemo { public static void main(String[] args) throws Exception{ S ...

  6. 前端基础-CSS属性操作

    前端基础-CSS属性操作 css text 文本颜色:color 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RGB值 - 如: RGB( ...

  7. my.cnf重要配置参数说明

    不同存储引擎中关键参数优化 MyISAM存储引擎 MyISAM存储引擎适用于读多写少,对读性能要求比较高的系统 官方文档:http://dev.mysql.com/doc/refman/5.6/en/ ...

  8. 圆方树&广义圆方树[学习笔记]

    仙人掌 圆方树是用来解决仙人掌图的问题的,那什么是仙人掌图呢? 如图,不存在边同时属于多个环的无向连通图是一棵仙人掌 圆方树 定义 原先的仙人掌图,通过一些奇妙的方法,可以转化为一棵由圆点,方点和树边 ...

  9. Qt之界面实现技巧-- 窗体显示,绘制背景,圆角,QSS样式

    转自 --> http://blog.sina.com.cn/s/blog_a6fb6cc90101dech.html 总结一下,在开发Qt的过程中的一些技巧!可遇而不可求... 一.主界面 1 ...

  10. tomcat警告:Setting property 'source' to 'org.eclipse.jst.j2ee.server:ServletPro' did not find a matching property

    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclips ...