UVA 10910 Marks Distribution

UVA_10910

    首先,如果总的分数不够的话,肯定输出0。之后我们就可以把问题转化成这样了,假设多出来的分数为p,那么把p个相同的小球放到N个盒子里,每个盒子可以为空,一共有多少种方法?

    解决上面说的这种放小球的问题可以用“隔板法”,N-1隔板隔开的小球的情况就是相应每个盒子里小球的状况,由于盒子可以为空,就相当于p+N-1和空位选出N-1个位置放隔板的方法数,那么结果就是C(p+N-1,N-1),转换成原题的数据,就是C(T-P*N+N-1,N-1)。

#include<stdio.h>
#include<string.h>
int N, T, P;
void solve()
{
int i;
long long int m, n, res;
n = T - P * N;
if(n < 0)
printf("0\n");
else
{
m = T - P * N + N - 1;
if(m - n < n)
n = m - n;
res = 1;
for(i = 1; i <= n; i ++)
res = res * (m - i + 1) / i;
printf("%lld\n", res);
}
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
scanf("%d%d%d", &N, &T, &P);
solve();
}
return 0;
}


你可能感兴趣的:(mark)