题目大概问小于等于m个的物品放到n个地方有几种方法。

即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m。

这个方程的非负整数解个数是个经典问题,可以+1转化正整数解的个数用插板法解决:$C_{y+n-1}^{n-1}=C_{y+n-1}^y$。

而0<=y<=m,最后的结果就是——

$$\sum_{i=0}^m C_{i+n-1}^i$$

$$C_{n-1}^0+C_{n}^1+C_{n+1}^2+\dots+C_{n-1+m}^m$$

$$C_{n}^0+C_{n}^1+C_{n+1}^2+\dots+C_{n-1+m}^m$$

$$C_{n+1}^1+C_{n+1}^2+\dots+C_{n-1+m}^m\ \tag{$C_{n+1}^1=C_{n}^0+C_{n}^1$}$$

$$C_{n+2}^2+\dots+C_{n-1+m}^m\ \tag{$C_{n+2}^2=C_{n+1}^1+C_{n+1}^2$}$$

$$\vdots$$

$$C_{n+m}^m$$

于是就推算出结果是$C_{n+m}^m$。那么就是计算$C_{n+m}^m\ mod \ p$,其中1<=n,m<=1000000000,1<p<100000且p为质数。

这时就是用Lucas定理来计算这种大组合数的模:$Lucas(n,m)\equiv C_{n\%p}^{m\%p}\times Lucas(n/p,m/p)\pmod p$。

另外计算组合数时,利用模p下的乘法逆元,$C_n^m\equiv\frac {n!}{(n-m)!m!}\equiv n!\times((n-m)!m!)^{-1} \pmod p$

而计算逆元没必要用扩展欧几里得算法,因为p是质数,利用费马小定理可以推出n在模p下的乘法逆元为$n^{p-2}\ mod\ p$。

 #include<cstdio>
#include<cstring>
using namespace std;
long long ine(long long n,long long p){
long long res=,m=p-;
while(m){
if(m&) res=res*n%p;
n=n*n%p;
m>>=;
}
return res;
}
long long fact[]={};
long long lucas(long long n,long long m,long long p){
long long res=;
while(n&&m){
long long a=n%p,b=m%p;
if(a<b) return ;
res=res*fact[a]*ine(fact[b]*fact[a-b]%p,p)%p;
n/=p; m/=p;
}
return res;
}
int main(){
long long n,m,p;
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=; i<p; ++i) fact[i]=fact[i-]*i%p;
printf("%lld\n",lucas(n+m,m,p));
}
return ;
}

HDU3037 Saving Beans(Lucas定理+乘法逆元)的更多相关文章

  1. Hdu 3037 Saving Beans(Lucus定理+乘法逆元)

    Saving Beans Time Limit: 3000 MS Memory Limit: 32768 K Problem Description Although winter is far aw ...

  2. bzoj1272 Gate Of Babylon(计数方法+Lucas定理+乘法逆元)

    Description Input Output Sample Input 2 1 10 13 3 Sample Output 12 Source 看到t很小,想到用容斥原理,推一下发现n种数中选m个 ...

  3. hdu 3037 Saving Beans Lucas定理

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

  4. 【BZOJ】2982: combination(lucas定理+乘法逆元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2982 少加了特判n<m return 0就wa了QAQ lucas定理:C(n, m)%p=( ...

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

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

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

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

  7. hdu3037 Saving Beans(Lucas定理)

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

  8. hihocoder #1698 假期计划 (排列组合+费马小定理+乘法逆元)

    Description 小Ho未来有一个为期N天的假期,他计划在假期中看A部电影,刷B道编程题.为了劳逸结合,他决定先拿出若干天看电影,再拿出若干天刷题,最后再留若干天看电影.(若干代指大于0)  每 ...

  9. [HDU3037]Saving Beans,插板法+lucas定理

    [基本解题思路] 将n个相同的元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m-1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序的m份,每个组依次按组序号分到对应位置的几个元 ...

随机推荐

  1. shell编程报错 [: missing `]'

    NGINX_RATES=50 NGINX_BURST=3000 NGINX_PATH=/opt/srv/nginx/conf/nginx.conf BEE_PATH=/opt/srv/nginx/co ...

  2. 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.

    在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...

  3. [BZOJ1529][POI2005]ska Piggy banks

    [BZOJ1529][POI2005]ska Piggy banks 试题描述 Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个存钱罐的钥匙放 ...

  4. Android5.0版本之后切换听筒模式

    5.0以前Android听筒模式和扬声器模式这样就管用 扬声器://关闭麦克风  mAudioManager.setMicrophoneMute(false);  // 打开扬声器  mAudioMa ...

  5. Mysql_以案例为基准之查询

    查询数据操作

  6. Mac 下 Chrome 浏览器 快捷键

    ⌘-Option-I 打开“开发人员工具”. ⌘-Option-J 打开“JavaScript 控制台”. ⌘-Option-U 打开当前网页的源代码. 转自: http://www.harbin-s ...

  7. (转)使用SQLCMD在SQLServer执行多个脚本

    概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客 ...

  8. Java集合框架中List接口的简单使用

    Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...

  9. Greedy:三角形问题

    题目大意:有n根长度的为a1,a2....an的棒子,如果棒子可以组成三角形,求这些棒子能组成的三角形的最大周长? 这一题,一般人只能想到三重循环,当然我们是CS专业的,不能这样想,其实这题可以用DP ...

  10. Spring MVC程序中得到静态资源文件css,js,图片

    转载自:http://www.blogjava.net/fiele/archive/2014/08/24/417283.html 用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题, ...