Atcoder ABC132 D - Blue and Red Balls

D - Blue and Red Balls
Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 400 points

Problem Statement
There are K blue balls and N−K red balls. The balls of the same color cannot be distinguished. Snuke and Takahashi are playing with these balls.

First, Snuke will arrange the N balls in a row from left to right.

Then, Takahashi will collect only the K blue balls. In one move, he can collect any number of consecutive blue balls. He will collect all the blue balls in the fewest moves possible.

How many ways are there for Snuke to arrange the N balls in a row so that Takahashi will need exactly i moves to collect all the blue balls? Compute this number modulo 109+7 for each i such that 1≤i≤K.

Constraints
1≤K≤N≤2000
Input
Input is given from Standard Input in the following format:
N K
Output
Print
K lines. The i-th line (1≤i≤K) should contain the number of ways to arrange the N balls so that Takahashi will need exactly i moves to collect all the blue balls, modulo 109+7.

Sample Input 1
Copy
5 3
Sample Output 1
Copy
3
6
1
There are three ways to arrange the balls so that Takahashi will need exactly one move: (B, B, B, R, R), (R, B, B, B, R), and (R, R, B, B, B). (R and B stands for red and blue, respectively).

There are six ways to arrange the balls so that Takahashi will need exactly two moves: (B, B, R, B, R), (B, B, R, R, B), (R, B, B, R, B), (R, B, R, B, B), (B, R, B, B, R), and (B, R, R, B, B).

There is one way to arrange the balls so that Takahashi will need exactly three moves: (B, R, B, R, B).

題意:一共有n個球,其中有k個藍色的球,n-k個紅色的球,現在將k個藍色的球分成m堆,1≤m≤k
然後和紅色的球混合,問你有多少種不同的排列。

思路:很明顯這是一個排列組合中的插空法的題目,有n-k個紅球,所以有n-k+1個空,在n-k+1個空中插入m堆藍色的球,很顯然不同的排列的個數爲C(n-k+1,m);接下來計算將k個球分成m堆的種數,枚舉幾組可以發現種數爲C(k-1,m-1);所以最後的答案就是C(n-k+1,m)*C(k-1,m-1)。

代碼:

#include<bits/stdc++.h>
#define LL long long
#define Max 2005
const LL mod=1e9+7;
const LL LL_MAX=9223372036854775807;
using namespace std;
LL C[Max][Max];
void Compare_C(){//打表
    C[0][0]=1;
    for(int i=1;i<Max;i++){
        C[i][0]=C[i][i]=1;
        for(int j=1;j<=i;j++){
            C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
        }
    }
}
int main()
{
    Compare_C();
    int b,r,c;
    scanf("%d%d",&c,&b);
    r=c-b+1;
    for(int i=1;i<=b;i++){
        printf("%lld\n",(C[b-1][i-1]*C[r][i])%mod);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章