1. 程式人生 > >hihocoder 1882 : 播放列表 (DP 或 容斥)

hihocoder 1882 : 播放列表 (DP 或 容斥)

#1882 : 播放列表

時間限制:10000ms

單點時限:1000ms

記憶體限制:256MB

描述

小Hi的手機中存著N首他喜愛的歌曲。現在小Hi希望製作一個長度為L的播放列表,滿足

1. 每一首歌至少播放一編

2. 同一首歌不能連續播放,之間至少間隔一首其他歌曲

請你計算一共有多少種不同的播放列表滿足條件?由於結果可能非常大,你只需要輸出結果模1000000009的餘數。

輸入

兩個整數N和L。

對於30%的資料,1 ≤ N ≤ 5,N ≤ L ≤ 10  

對於100%的資料,1 ≤ N ≤ 1000, N ≤ L ≤ 2000

輸出

一個整數,代表答案。

樣例輸入

3 4

樣例輸出

18

 

#include<bits/stdc++.h>
using namespace std;
long long mod=1000000009;
int n,l;
long long dp[2005][2005];
int main()
{
    cin>>n>>l;
    memset(dp,0,sizeof(dp));
    dp[1][1]=n;
    for(int i=1; i<l; i++)
    {
        for(int j=1; j<=n; j++)
        {
            dp[i+1][j]= (dp[i+1][j]+dp[i][j]*(j-1)%mod)%mod;
            dp[i+1][j+1]=(dp[i+1][j+1] + dp[i][j]*(n-j)%mod)%mod;
        }
    }
    cout<<dp[l][n]<<endl;

    return 0;
}