标签:
题目链接:http://codeforces.com/problemset/problem/431/C
题意:给一个k-tree,每个节点有k个儿子,然后边权从左到右依次为1-k,给定n, k, d, 求至少有一条边权值>=d然后总和是n有多少种方法
题解:dp[i][j][0]表示当前到第i层,和为j,没有超过d的边权的方法数,dp[i][j][1]表示当前到第i层,和为j,有超过d的边权的方法数。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const int mod = 1e9+7;
LL dp[101][101][2];
int main()
{
int n, k, d;
cin >> n >> k >> d;
dp[0][0][0] = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
for(int x = 1; x < d && x+j <= n; x++) dp[i+1][j+x][0] = (dp[i+1][j+x][0]+dp[i][j][0])%mod;
for(int x = 1; x <= k && x+j <= n; x++)
if(x < d) dp[i+1][j+x][1] = (dp[i+1][j+x][1