Cod sursa(job #3294832)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 29 aprilie 2025 11:50:58
Problema Arbori Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#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;
}