k-Tree
time limit per test:1 second
memory limit per test:256 megabytes
Quite recently a creative student Lesha had a lecture on trees. After the lecture Lesha was inspired and came up with the tree of his own which he called a k-tree.
A k-tree is an infinite rooted tree where:
- each vertex has exactly k children;
- each edge has some weight;
- if we look at the edges that goes from some vertex to its children (exactly k edges), then their weights will equal 1, 2, 3, ..., k.
The picture below shows a part of a 3-tree.
Help Dima find an answer to his question. As the number of ways can be rather large, print it modulo 1000000007 (109 + 7).
Input
A single line contains three space-separated integers: n, k and d (1 ≤ n, k ≤ 100; 1 ≤ d ≤ k).
Output
Print a single integer — the answer to the problem modulo 1000000007 (109 + 7).
Examples
Input
3 3 2
Output
3
Input
3 3 3
Output
1
Input
4 3 2
Output
6
Input
4 5 2
Output
7
题目链接:http://codeforces.com/problemset/problem/431/C
题目大意:一棵k-Tree表示一棵满k叉树,每个祖先到孩子的边权依次为1-k,现在要求一条和为n的路径,要求路径上至少有一条边的权值大于等于d,求满足条件的路径个数
题目分析:类比背包,容易想到状态dp[i][j]表示合到数字i时,是否有一条边权大于等于d的路径数,转移不说了
7
题目链接:http://codeforces.com/problemset/problem/431/C
题目大意:一棵k-Tree表示一棵满k叉树,每个祖先到孩子的边权依次为1-k,现在要求一条和为n的路径,要求路径上至少有一条边的权值大于等于d,求满足条件的路径个数
题目分析:类比背包,容易想到状态dp[i][j]表示合到数字i时,是否有一条边权大于等于d的路径数,转移不说了
#include <cstdio>
int const MOD = 1e9 + 7;
int dp[105][2];
int main()
{
int n, k, d;
scanf("%d %d %d", &n, &k, &d);
dp[0][0] = 1;
for(int i = 0; i < n; i++)
{
for(int j = 1; j <= k && i + j <= n; j++)
{
if(j < d)
dp[i + j][0] = (dp[i + j][0] % MOD + dp[i][0] % MOD) % MOD;
else
dp[i + j][1] = (dp[i + j][1] % MOD + dp[i][0] % MOD) % MOD;
dp[i + j][1] = (dp[i + j][1] % MOD + dp[i][1] % MOD) % MOD;
}
}
printf("%d\n", dp[n][1]);
}