10943 - How do you add?(隔板法)

这个问题可以简化成在把N个球放在K个箱子里的方法个数,由于每个箱子可以是空的,所以我们不妨多加K个球,这样就可以至少保证一个箱子有一个球,之后用隔板法对N + K 个球进行分割,也就是在N + K - 1 个空位中选择K - 1位置 C(N + K - 1,K - 1)

求解方法递推就可以了。

另外:

	排列数
	A(m,n)=m(m-1)(m-2)……(m-n+1)= m!/(m-n)!
	而组合数
	C(m,n)=A(m,n)/n!
	C(m,0) = 1;
	0! = 1;
代码:
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn = 222;
const int mod  = 1000000;
LL C[maxn][maxn];
void init(){
    C[1][0] = 1; C[1][1] = 1;
    for(int i = 2; i <= 200; i++){
        for(int j = 0; j <= i; j++){
            if(j)
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
            else
                C[i][j] = 1;
            C[i][j] %= mod;
        }
    }
}
void debug(){

}
int main(){
    init();
    int n,m;
    while(scanf("%d%d",&n,&m) != EOF){
        if(!n && !m) break;
        LL ans = C[n + m - 1][m - 1];
        printf("%lld\n",ans);
    }
    return 0;
}

时间: 2024-10-11 02:38:38

10943 - How do you add?(隔板法)的相关文章

UVA10943- How do you add?(隔板法)

题目链接 题意:求由K个不大于N的非负整数组合而成N的方法数. 思路:隔板法.这个问题可以等价于有N个小球放入K个盒子中,盒子可以为空,问有几种放置的方法.但因为盒子为空,不符合隔板法,所以我们可以先往每个盒子里面放置一个小球,满足每个盒子都不为空的,等分完后,在每个盒子减去一个小球.所以就相当与将N + K - 1个小球分为K - 1份.之后就是组合数学的问题了. 代码: #include <iostream> #include <cstdio> #include <cst

UVa 10943 - How do you add?

题目:求一个数字n拆成k个数字的拆法数,可以重复,可以有0. 分析:dp,组合数学. 方法1:dp 状态:f(i,j)为 j 拆成 i 个数字的方法数,则有f(i,j)= sum(f(i,k))  { 0 ≤ k ≤ j }: 方法2:计数原理 隔板法:C(n+k-1,k-1)= (n+1)(n+2)... (n+k-1), 计算利用 C(n,m)= C(n-1,m-1)+ C(n-1,m)即可. 说明:╮(╯▽╰)╭. 方法一:dp #include <iostream> #include

Uva 10943 - How do you add ?( 组合数公式 + 递推 )

Uva 10943 - How do you add ?( 组合数公式 + 递推 ) 题意:给定一个数N,分解韡k个数,问有多少种组合.数可以重复 (N<=100) 分析:通过组合数学将题目抽象为 N个相同的小球,放入k个不同的盒子中,且允许盒子为空然后就可以用隔板法------> ANS = C(N+M-1,M-1)隔板法--> BD然后再根据组合数的性质可以进行递推(这题数据范围比较小)----> C(A,B) = C(A-1,B) + C(A-1,B-1);预处理一遍之后即可

BZOJ 3028: 食物 [生成函数 隔板法 | 广义二项式定理]

3028: 食物 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 497  Solved: 331[Submit][Status][Discuss] Description 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险! 我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数. 他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等 当然,他又有一些稀奇古怪的限制: 每种

UVa 10943 - How do you add?(组合数)

求一个数n拆成k个数的方法个数. 利用隔板法求得 ans=(n+k?1k?1) 利用c[i][j]=(c[i?1][j]+c[i?1][j?1])%mod递推预处理组合数,然后读入n.k输出答案即可. #include<cstdio> const int maxn=210; const int mod=1000000; int c[maxn][maxn]; int main(){ for(int i=0;i<maxn;++i) c[i][0]=1; for(int i=1;i<ma

UVa 10943 How do you add?【递推】

题意:给出n,k,问恰好有k个不超过n的数的和为n的方案数有多少 可以隔板法来做 现在有n个小球放到k个盒子里面,盒子可以为空 那么就是n-k+1个缝隙,放上k-1个隔板(k-1个隔板就分成了k份) 所以总的方案数为 C(n+k-1,k-1) 所以可以转化为C(i,j)=C(i-1,j)+C(i,j-1) 即为d[i][j]=d[i-1][j]+d[i][j-1], d[i][j]表示j个数的和恰为i的方案数 1 #include<iostream> 2 #include<cstdio&

uva10943(隔板法)

很裸的隔板法. 引用一下维基上对隔板法的解释: 现在有10个球,要放进3个盒子里 ●●●●●●●●●● 隔2个板子,把10个球被隔开成3个部份 ●|●|●●●●●●●●.●|●●|●●●●●●●.●|●●●|●●●●●●.●|●●●●|●●●●●.●|●●●●●|●●●●.●|●●●●●●|●●●....... 如此类推,10个球放进3个盒子的方法总数为 n个球放进k个盒子的方法总数为 问题等价于求的可行解数,其中为正整数. **如果允许有空盒子**: 现在有10个球,要放进3个盒子里,并允许空

组队赛第五场 组合隔板法+最小生成树预处理并查集

UVALive 6434 题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4445 这题正好就是大一小学期的时候好像是曦曦出的那个牛那题吧,就是要买多少块板然后正好把牛给拦完.这题也是一样,就是找最大的距离,当做隔板,依次把最大的距离去掉,最后的就是最小的了. #include<iostream> #in

51Nod 1509 加长棒(隔板法)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1509 思路: 直接去解可行的方法有点麻烦,所以应该用总的方法去减去不可行的方法,有点像容斥原理. 将加长棒分成4个部分,允许为0,其中一部分表示剩余.这个就是经典的隔板法了. 这是百度百科上的一个例子,看完之后应该就理解隔板法的做法了吧. 这道题目也就是要将L分成4部分,允许为空,所以先L+4,表示每个部分至少为1,所以总共有L+4-1的空隙可以插板,我们需要插3个板,