// La secuencia de probing del dict de CPython: probe_order <casillas> <hash> [cuántas]
// Usa la recurrencia de Objects/dictobject.c: perturb >>= 5; i = (i*5 + perturb + 1) & mask.
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <iostream>

int main(int argc, char** argv) {
    if (argc < 3) {
        std::cerr << "uso: probe_order <casillas> <hash> [cuántas]\n";
        return 2;
    }
    const std::uint64_t slots = std::strtoull(argv[1], nullptr, 10);
    const std::uint64_t hash = std::strtoull(argv[2], nullptr, 10);
    const std::size_t count = argc > 3 ? std::strtoul(argv[3], nullptr, 10) : slots;
    const std::uint64_t mask = slots - 1;

    std::uint64_t perturb = hash;
    std::uint64_t i = hash & mask;
    std::cout << "casillas " << slots << ", hash " << hash << ":";
    for (std::size_t step = 0; step < count; step++) {
        std::cout << " " << i;
        perturb >>= 5;
        i = (i * 5 + perturb + 1) & mask;
    }
    std::cout << "\n";
    return 0;
}
