这样就非常简单,对于第i首歌来说,它有几种选择呢?很显然,因为每k个位置的歌都不相同,所以有如下结论(设选择数为c):
c
(
i
)
=
n
−
k
,
i
>
k
c
(
i
)
=
n
−
i
−
1
,
i
<
=
k
c(i) = n - k, \quad i > k \\ c(i) = n - i - 1, \quad i <= k
c(i)=n−k,i>kc(i)=n−i−1,i<=k
最后的计算公式是:
R
=
∑
i
=
k
+
1
N
(
−
1
)
n
−
i
C
n
n
−
i
A
i
i
−
k
(
i
−
k
)
L
−
k
R = \sum_{i=k+1}^N (-1)^{n-i} C_n^{n-i}A_i^{i-k}(i-k)^{L - k}
R=i=k+1∑N(−1)n−iCnn−iAii−k(i−k)L−k
class Solution {typedeflonglong ll;
public:staticconst ll MOD =1e9+7;
ll extgcd(ll a,ll b,ll& x,ll& y){if(b !=0){
ll ret =extgcd(b,a%b,y,x);
y -= a / b * x;return ret;}else{
x =1, y =0;return a;}}
ll mod_inverse(ll a){
ll x, y;extgcd(a, MOD, x, y);return(MOD + x % MOD)% MOD;}
ll fact[101];voidcal_fact(int n){
fact[0]=1;for(int i =1; i <= n; i++){
fact[i]=(fact[i-1]*ll(i))% MOD;}}
ll mod_comb(ll n, ll k){if(n <0|| k <0|| n < k)return0;
ll a1 = fact[n], a2 = fact[k], a3 = fact[n-k];return a1 *mod_inverse(a2 * a3 % MOD)% MOD;}
ll mod_pow(ll x, ll n){
ll res =1;while(n >0){if(n &1)
res = res * x % MOD;
x = x * x % MOD;
n >>=1;}return res;}intnumMusicPlaylists(int N,int L,int K){cal_fact(N);
ll res =0;for(int i = N; i > K; i--){
ll now = N - i &1?-1:1;
now =(now *mod_comb(N, i))% MOD;
now =(now *mod_pow(i - K, L - K))% MOD;
now =(now * fact[i])% MOD;
now =(now *mod_inverse(fact[i-K]))% MOD;
res =(res + now + MOD)% MOD;}return res;}};
DP
class Solution {typedeflonglong ll;
public:staticconst ll MOD =1e9+7;intnumMusicPlaylists(int N,int L,int K){
vector<ll>dp(N +1);
dp[0]=1;for(int i =1; i <= L; i++){for(int j =min(N, i); j >0; j--){
dp[j]=(dp[j-1]*(N - j +1)+ dp[j]*max(j - K,0))% MOD;}
dp[0]=0;}return dp[N];}};