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;
}
posted @ 2021-05-06 11:27  u_yan  阅读(34)  评论(0编辑  收藏  举报