zoukankan      html  css  js  c++  java
  • codechef : Marbles 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载。 https://blog.csdn.net/kenden23/article/details/27830457

    Rohit dreams he is in a shop with an infinite amount of marbles. He is allowed to select n marbles. There are marbles of k different colors. From each color there are also infinitely many marbles. Rohit wants to have at least one marble of each color, but still there are a lot of possibilities for his selection. In his effort to make a decision he wakes up.
    Now he asks you how many possibilities for his selection he would have had.
    Assume that marbles of equal color can't be distinguished, and the order of the marbles is irrelevant.

    Input


    The first line of input contains a number T <= 100 that indicates the number of test cases to follow. Each test case consists of one line containing n and k, where n is the number of marbles Rohit selects and k is the number of different colors of the marbles. You can assume that 1<=k<=n<=1000000.

    Output


    For each test case print the number of possibilities that Rohit would have had.
    You can assume that this number fits into a signed 64 bit integer.

    Example

    Input:
    2
    10 10
    30 7
    
    Output:
    1
    475020

    本题是一题组合数学的题目。

    应用到比較高级一点的数学知识。

    能够觉得是一题indistinguishable objects to distinguishable boxes 把同样的物体放进不同盒子的问题。

    这样应用公式是:C(n, n+k-1) = C(k-1, n+k-1),n代表物体k代表盒子

    可是由于须要每一个盒子最少必须放置一个物体,故此减去每一个盒子的这一个球,就得到公式:C(k-1, n+k-1-k)

    这样就能够简化为计算一个公式的问题了。

    注意: 这里是同样物体放进不同盒子,所以比較简单。注意区分不同物体放进不同盒子中。

    #include <stdio.h>
    #include <math.h>
    #include <algorithm>
    using std::min;
    
    class Marbles
    {
    	long long C(int n, int k)
    	{
    		long long ans = 1LL;
    		k = min(k, n-k);
    		for (int i = 1; i <= k; i++)
    		{
    			ans *= (n-i+1);
    			ans /= i;//这里肯定是能够除尽的,所以不用推断
    		}
    		return ans;
    	}
    public:
    	Marbles()
    	{
    		int T, nsel, kcol;
    		scanf("%d", &T);
    		while (T--)
    		{
    			scanf("%d %d", &nsel, &kcol);//kcol <= nsel
    			if (nsel < kcol)
    			{
    				puts("0");
    				continue;
    			}
    			int n = nsel + kcol - 1 - kcol;
    			int k = kcol - 1;
    			printf("%lld
    ", C(n, k));
    		}
    	}
    };



  • 相关阅读:
    .NET MVC后台发送post请求
    (整理)Sublime Text 3 安装、破解、安装Package Control、汉化、添加到右键菜单、代码格式化、禁止更新
    百度api查询多个地址的经纬度的问题
    try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?
    js获取某个日期所在周周一的日期
    重学C++ (1)
    基于.NET平台常用的框架整理
    指针常量和常量指针的区别
    C++四种强制类型转换关键字
    const define 定义常量的区别
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9970688.html
Copyright © 2011-2022 走看看