CF431C k-Tree

原题链接

  • 题意:有 (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;
}
原文地址:https://www.cnblogs.com/Xiao-yan/p/14734424.html