小明喜欢在火车旅行的时候用手机听音乐,他有N首歌在手机里,在整个火车途中,他可以听P首歌,所以他想产生一个播放表产生P首歌曲,这个播放表的规则是:
(1)每首歌都要至少被播放一次
(2)在两首一样的歌中间,至少有M首其他的歌
小明在想有多少种不同的播放表可以产生,那么给你N,M,P,你来算一下,输出结果取1000000007的余数
输入描述:
输入N,M,P
N范围在1到100
M范围在0到N
P范围在N到100
输出描述:
输出结果mod 1000000007的余数
示例1
输入
1 0 3
输出
1
#include <iostream>
#include <cstring>
#include <fstream>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
using namespace std;
const int M = 1e9 + 7;
const int N = 110;
long long f[N][N];
int main(){
int m,n,p;
cin>> n >> m >>p;
f[0][0]=1;//f[n][p] 表示用n首歌,填满p个位置的方法数量
for(int i=1;i<=n;i++){
for(int j=i;j<=p;j++){
//在p>n情况中,在第p位置填入一个在第p位置之前已经填写过的歌曲
if(j>i && i>m)f[i][j]+=(i-m)*f[i][j-1];
//在p==n的情况中,有n的阶乘种方法填满所有p个位置
f[i][j]+=f[i-1][j-1]*i;//diff
if(f[i][j]>=M)f[i][j]%=M;
}
}
cout<<f[n][p];
return 0;
}