Решение задачи "k-дерево" с Codeforces

Без пояснения   Просмотров: 18


Совсем недавно креативный студент Леша прослушал лекцию по деревьям. После лекции Леша был вдохновлен и придумал собственное дерево, которое он назвал k-дерево.

k-дерево — это бесконечное корневое дерево, в котором:

каждая вершина имеет ровно k сыновей;
каждое ребро имеет некоторый вес;
если рассмотреть ребра из некоторой вершины в ее сыновей (ровно k ребер), то их веса будут равны 1, 2, 3, ..., k.
На рисунке ниже представлен фрагмент 3-дерева.
Как только Дима, хороший друг Леши, узнал про это дерево, его сразу заинтересовал вопрос: «Сколько существует путей с суммарным весом ребер равным n, которые начинаются в корне k-дерева, а также содержат хотя бы одно ребро веса не меньше d?».
Помогите Диме узнать ответ на его вопрос. Так как количество путей может быть достаточно большим, найдите остаток от деления ответа на 1000000007 (109 + 7).

Код

#include<bits/stdc++.h>
using namespace std;
int f[105][2];
int main() {
	int n, k, d, m = 1000000007;
	cin >> n >> k >> d;
	f[0][1] = 1;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= min(i, k); j++) {
			f[i][0] = (f[i][0] + f[i - j][j >= d]) % m;
			f[i][1] = (f[i][1] + f[i - j][1]) % m;
        }
	}
	cout<<f[n][0];
	return 0;
}

         

 Администратор Photo Автор: Администратор


Отправить решение задачи
Чтобы отправить решение вам нужно войти в систему или зарегистрироваться

Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться