1. 程式人生 > >SPOJ-MARBLES Marbles【組合】

SPOJ-MARBLES Marbles【組合】

Marbles


Hänschen 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. Hänschen 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 possibilites 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 Hänschen 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 Hänschen 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

問題簡述:(略)

問題分析

  組合計算問題,不多解釋。

  n個球分配k種顏色,相當與n個球之間n-1個空隙插上隔板,答案為C(n-1,k-1)。

程式說明:(略)

題記:(略)

參考連結:(略)

AC的C++語言程式如下:

/* SPOJ-MARBLES Marbles */

#include <bits/stdc++.h>

using namespace std;

long long C(int n, int k)
{
    if(k > n - k)
        k = n - k;

    long long ans = 1;
    for(int i=0; i<k; i++)
        ans = ans * (n - i) / (i + 1);

    return ans;
}

int main()
{
    int t;

    scanf("%d", &t);
    while(t--) {
        int n, k;

        scanf("%d%d", &n, &k);

        printf("%lld\n", C(n - 1, k - 1));
    }

    return 0;
}