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

【题意】

  • m个松果,n棵树
  • 求把最多m个松果分配到最多n棵树的方案数
  • 方案数有可能很大,模素数p
  • 1 <= n, m <= 1000000000, 1 < p < 100000

【思路】

  • 答案为C(n+m,m)%p
  • 对于C(n, m) mod p。这里的n,m,p(p为素数)都很大的情况。就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了。这里用到Lucas定理。

  • 下面证明为什么答案是C(n+m,m):

  • 把i个松果分配到最多n棵树的方案数是:C(i+n-1,i)(相当于x1+x2+......+xn=i的解的个数,用插板法,插n-1个板,共i+n-1个位置选i个1,因为xi可能是0,所以满足最多n棵树)
  • 现在就需要求不大于m的,相当于对i = 0,1...,m对C(n+i-1,i)求和,根据公式C(n,k) = C(n-1,k)+C(n-1,k-1)得

    C(n-1,0)+C(n,1)+...+C(n+m-1,m)

    = C(n,0)+C(n,1)+C(n+1,2)+...+C(n+m-1,m)

    = C(n+m,m)

【AC】

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll n,m,p; ll fpow(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 ;
m=min(m,n-m);
ll lm=,ln=;
for(ll i=;i<m;i++)
{
lm=(lm*(m-i))%p;
ln=(ln*(n-i))%p;
}
ll ans=ln*fpow(lm,p-,p)%p;
return ans;
}
ll Lucas(ll n,ll m,ll p)
{
ll ans=;
while(n&&m&&ans)
{
ans=(ans*Comb(n%p,m%p,p))%p;
n/=p;
m/=p;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&m,&p);
n+=m;
ll ans=Lucas(n,m,p);
printf("%lld\n",ans);
}
return ;
}

Lucas模板

【组合数+Lucas定理模板】HDU 3037 Saving的更多相关文章

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

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

  2. 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数

    typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...

  3. hdu 3037 Saving Beans(组合数学)

    hdu 3037 Saving Beans 题目大意:n个数,和不大于m的情况,结果模掉p,p保证为素数. 解题思路:隔板法,C(nn+m)多选的一块保证了n个数的和小于等于m.可是n,m非常大,所以 ...

  4. uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)

    uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...

  5. hdu 3037 Saving Beans Lucas定理

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

  6. HDU 3037 Saving Beans(Lucas定理的直接应用)

    解题思路: 直接求C(n+m , m) % p , 由于n , m ,p都非常大,所以要用Lucas定理来解决大组合数取模的问题. #include <string.h> #include ...

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

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

  8. HDU 3037 Saving Beans (Lucas法则)

    主题链接:pid=3037">http://acm.hdu.edu.cn/showproblem.php?pid=3037 推出公式为C(n + m, m) % p. 用Lucas定理 ...

  9. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

随机推荐

  1. 洛谷 P2483 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  2. Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

    面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...

  3. iview 表单验证 input 用失去焦点事件 blur, select下拉选框 要用change事件 验证

    birthday: [{ required: true, message: '内容不能为空', trigger: 'blur' }],belongDept: [{ required: true, me ...

  4. 3d点云

    rgb-d:rgb加depth组成4channel的 3d点云

  5. 以太坊开发框架Truffle学习笔记

    from http://truffleframework.com/docs/getting_started/project 1. 安装node.js 8.11.2 LTS 2. 安装Truffle $ ...

  6. java上传、下载、删除ftp文件

    一共三个类,一个工具类Ftputil.,一个实体类Kmconfig.一个测试类Test 下载地址:http://download.csdn.net/detail/myfmyfmyfmyf/669710 ...

  7. oracle row_number的使用

    create table studentInfo(  id number(8) primary key,  name varchar2(20) not null,  ObjectName varcha ...

  8. 有趣的this以及apply,call,bind方法

    看this指向谁,要看执行时而非定义时(箭头函数除外).函数没有绑定在对象上调用,非'strict'模式下,this指向window,否则为undefined 改变this指向的方法 1. apply ...

  9. 【Linux】用户与权限

    追加用户组 groupadd 用户组名 追加新用户 useradd -d 指定用户目录 -s 指定用户使用shell -g 指定用户组 -p 指定用户密码 用户名 更改用户  添加用户到其他组 use ...

  10. python 中requests 模块用py2exe生成exe后SSL certificate exception的问题

    [('system library', 'fopen', 'No such process'), ('BIO routines', 'BIO_new_file', 'no such file'), ( ...