Pagini recente » Cod sursa (job #2746405) | Cod sursa (job #450792) | Cod sursa (job #3294832)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbori.in");
ofstream fout("arbori.out");
typedef long long ll;
int n, mod, rest, st[110][110];
ll rez;
inline void afis(int k, int nivel) {
for(int i=1; i<=k; i++) cout << st[nivel][i] << " ";
cout << '\n';
}
inline void backTrack(int k, int trebe, int maxSum, int last, int sum, int ramas, int nivel) {
if(last == 0) last = mod;
if(k > trebe) {
if(sum != 0) {
///sa fie si valid
//afis(k - 1, nivel);
if(sum == ramas) rez++;
else backTrack(1, sum, maxSum - sum, (rest - 1 + mod) % mod, 0, ramas - sum, nivel + 1);
}
}
else {
///verific daca pot sa pun 0(adk sa fie frunza)
if(st[nivel][k - 1] == 0) {
st[nivel][k] = 0;
backTrack(k + 1, trebe, maxSum, last, sum, ramas, nivel);
}
///tot timpu le fac crescatoare sa nu mi se repete
for(int i=last; sum + i <= maxSum; i+=mod) {
st[nivel][k] = i;
backTrack(k + 1, trebe, maxSum, i, sum + i, ramas, nivel);
}
}
}
int main()
{
fin >> n >> mod >> rest;
backTrack(1, 1, n - 1, rest, 0, n - 1, 1);
fout << rez;
return 0;
}