原题链接
- 题意:有 \(k\) 叉树,边权是从 \(1\) 到 \(k\),要求边权和为 \(n\),至少有一条边的边权大于 \(d\) 的路径总数量。
- 题解:因为边权连续,所以 \(f_i = \sum_{j = n-k}^{j < i} f_j\) 就是所有情况的路径数量,然后还有就是,\(g_i = \sum_{j=n-d + 1}^{j < i}\) 就是所有小于 \(d\) 的边构成的路径数量,然后一减就是答案,ideas来自a。
- 代码:
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 5e5 + 9;
const ll mod = 1e9 + 7;
ll dp[N];
ll dp1[N];
int main() {
ll n, k, d;
cin >> n >> k >> d;
ll ans = 1;
dp[0] = 1;
dp1[0] = 1;
for (ll i = 1; i <= n; i ++) {
for (ll j = max(i-k, (ll)0); j < i; j ++) {
(dp[i] += dp[j])%=mod;
}
}
for (ll i = 1; i <= n; i ++) {
for (ll j = max((ll)0,i - d+1); j < i; j ++) {
(dp1[i] += dp1[j])%=mod;
}
}
cout << ((dp[n] - dp1[n])%mod + mod)%mod<< endl;
}