vijos1060 隔板法

排列组合问题

之前没有学过隔板法,随便学习了一下

其实挺好理解的

附上题解:

先只考虑一种球:
因为有n个盒子每个盒子可以放任意多球,还可以空出来任意多球。所以可以考虑为n+1个盒子,最后一个盒子里面是题中没放的球。
由于盒子可以空出来,所以将隔板与球一起排列 即在隔板和球组成的n+a列中 选出任意a个位置放隔板的话,就可以实现题目要求的效果!(0个或任意多个)。
两种球所以C(n+a,a)*C(n+b,b)。

 之后还需要注意精度问题

一直不是很注意这种事情,mark

最后一个点需要用到 unsigned long long

 

附上丑丑的代码:

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

using namespace std;

int n,m,a,b; 

double sum1,sum2;

unsigned long long c;

int main(){

	scanf("%d%d%d",&n,&a,&b);

	sum1=1;

	for(int i=1+n;i<=a+n;i++){

		sum1=(sum1*i)/(i-n);

	}

	sum2=1;

	for(int i=n+1;i<=b+n;i++){

		sum2=(sum2*i)/(i-n);

    }

    c=sum1*sum2;

    cout<<c;

	return 0;

}

 哦...顺便提一下,自己之前写排列组合的时候,有时候会脑抽把它看成分子分母的乘积再相除

= =发现有bug...勿闹

你可能感兴趣的:(OS)