#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

dp[i][j]代表着 

 

 

 

#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;//播放列表为i,有j首歌曲的数量  开始有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;//如果不选新歌  ,有j-1种选法,
            dp[i+1][j+1]=(dp[i+1][j+1] + dp[i][j]*(n-j)%mod)%mod;//如果选新歌,有n-j种选法
        }
    }
    cout<<dp[l][n]<<endl;

    return 0;
}