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;
}

猜你喜欢

转载自blog.csdn.net/swustzhaoxingda/article/details/84975289