Codeforces Round #309 (Div. 2) C

題意:
就是給出總共有k種顏色,每種顏色有ki種,排列必須滿足第i+1種的最後一種顏色必須在第i種最後一種顏色的後面,其他顏色隨意。總共有多少種排列點的方法。

分析:

假設d[i]表示前i種的排列的數量,那麼第i+1種的數量就是d[i]*C(a[1]+a[2]+..a[i+1]-1,a[i+1]-1);預先處理好排列組合數就好了,直接計算。

ps:CF的比賽時間還真是有點煩,話說我一直不明白爲什麼我看電視能堅持到兩點,打CF就不行呢?於是我就邊看電視邊打CF~哈哈哈哈

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 1005
#define mod 1000000007
using namespace std;
int c[maxn][maxn];
int a[maxn];
int main()
{
    int i,j,k;
    c[1][0]=c[1][1]=1;
    for(i=2;i<maxn;i++)
    {
        c[i][0]=1;
        for(j=1;j<=i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
    }

    scanf("%d",&k);
    int x,sum=0;
    for(i=1;i<=k;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    LL res=1;

    for(i=k;i>1;i--)
    {
        res=(res*(LL)c[sum-1][a[i]-1])%mod;
        sum-=a[i];   
     } 
    cout<<res<<endl;

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