UVA 题目10910 Marks Distribution(组合数学)

In an examination one student appeared in N subjects and has got total T marks. He has passed in
all the N subjects where minimum mark for passing in each subject is P. You have to calculate the
number of ways the student can get the marks. For example, if N = 3, T = 34 and P = 10 then the
marks in the three subject could be as follows.
Subject 1 Subject 2 Subject 3
1 14 10 10
2 13 11 10
3 13 10 11
4 12 11 11
5 12 10 12
6 11 11 12
7 11 10 13
8 10 11 13
9 10 10 14
10 11 12 11
11 10 12 12
12 12 12 10
13 10 13 11
14 11 13 10
15 10 14 10
So there are 15 solutions. So F(3, 34, 10) = 15.
Input
In the first line of the input there will be a single positive integer K followed by K lines each containing
a single test case. Each test case contains three positive integers denoting N, T and P respectively.
The values of N, T and P will be at most 70. You may assume that the final answer will fit in a

standard 32-bit integer.

Output
For each input, print in a line the value of F(N, T, P).
Sample Input
2
3 34 10
3 34 10
Sample Output
15
15
题目大意:m大的数,分成n组,每组最少k个,问有多少种方法

思路:先把每组放k个,然后剩下的再放到n组中(可有可无),相当于n+m组,分成n组,插n-1个空,即从n+m-1个空中选n-1个空

ac代码

#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<limits.h>
#define N 100010
#define mod 1000000
#define LL long long
using namespace std;
LL C(LL a,LL b)
{
    LL ans=1;
    LL i;
    if(b>a/2)
        b=a-b;
    for(i=1;i<=b;i++)
    {
        ans*=(a-i+1);
        ans/=i;
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        LL n,m,k;
        scanf("%lld%lld%lld",&n,&m,&k);
        m=m-n*k;
        printf("%lld\n",C(n+m-1,n-1));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值