https://www.cnblogs.com/staginner/archive/2011/12/16/2290712.html
https://www.bbsmax.com/A/D854437V5E/
借鉴了上面两位大佬的,感觉应该是最简单的做法了吧。
#include <iostream>
#include <cstring>
#define mod 1000000007
/*有n张牌,求出至少有k张牌连续是正面的排列的种数。*/
//至多有n张牌是连续正面 - 至多有k-1张牌是连续正面
//https://www.cnblogs.com/staginner/archive/2011/12/16/2290712.html
//https://www.bbsmax.com/A/D854437V5E/
using namespace std;
typedef long long LL;
const int N = 1010;
LL dp[N];
LL n, k;
LL fun(LL n,LL k) {
//dp[i]表示抛第i个硬币时连续的H不超过k个的情况总数
memset(dp, 0, sizeof(dp));
dp[0] = 1;//
for (int i = 1; i <= n; i++) {
LL sum = (2 * dp[i - 1]) % mod;
if (i <= k)dp[i] = sum;
else if (i == k + 1)dp[i] = (sum - 1) % mod;
else dp[i] &