思路:m个重音符之间至少间隔k个音符,所以 (m - 1) * k个音符是必选的多余音符,然后再从n - (m - 1) * k个音符中选出m个音符即可,答案就是,提前判断一下n够不够选。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1100;
const int M = 1e6 + 10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
ll com[N][N];
class Solution {
public:
void init() {
memset(com, 0, sizeof(com));
for(int i = 0; i < N; ++i) {
com[i][0] = com[i][i] = 1;
for(int j = 1; j < i; ++j)
com[i][j] = (com[i - 1][j] + com[i - 1][j - 1]) % mod;
}
}
long long solve_bangbang(int n, int m, int k) {
init();
ll tmp = (m - 1) * k + m;
if(tmp > n) return 0;
n -= (m - 1) * k;
return com[n][m];
}
};