列表

详情


OR116. 音乐列表

描述

小明喜欢在火车旅行的时候用手机听音乐,他有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

原站题解

C++ 解法, 执行用时: 2ms, 内存消耗: 384KB, 提交时间: 2020-10-31

#include<bits/stdc++.h>
using namespace std;
long int mod=1000000007;
int main()
{
    int n,m,p;
    cin>>n>>m>>p;
    //cout<<n<<m<<p;
    long long int a[101][101];
    //long long int res=1;
    a[0][0]=1;//a[n][p]n首歌填满P个位置
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=p;j++)//p>=n
        {
            if(j>i&&i>m)//p>n,从之前的位置选一首有i*a[i][j-1]种方法,并且间隔中的歌已经不能选了所以*(i-m)不乘i
            {
                a[i][j]+=a[i][j-1]*(i-m);
            }
            a[i][j]+=a[i-1][j-1]*i;//p==n直接阶乘
            
            if(a[i][j]>=mod)//比每一步都mod省时间
            {
                a[i][j]%=mod;
            }
        }
    }
    //res=a[n][p]%mod;
    cout<<a[n][p];
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 468KB, 提交时间: 2020-07-14

/*#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int N,M,P;
    cin>>N>>M>>P;
    vector<long long> num(P);
    num[0]=N;
    for(int i=1;i<N;++i)
    {
        num[i]=num[i-1]*(N-i);
        num[i]=num[i]%1000000007;
    }
    for(int i=N;i<P;++i)
    {
        num[i]=num[i-1]*(N-M);
        num[i]=num[i]%1000000007;
    }
    cout<<num[P-1]<<endl;
    return 0;
}*/

#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
const int mod = 1000000007;
int n, m, p;
long long f[maxn][maxn];
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] >= mod)f[i][j] %= mod;
        }
    }
    cout<<f[n][p];
  
    return 0;
}

上一题