```python
def cut_roll(length: int, board: list[tuple[int, int]]) -> dict:
    if length < 0 or not isinstance(length, int):
        raise ValueError("Length must be a non-negative integer.")

    dp = [[0, []] for _ in range(length + 1)]

    for i in range(1, length + 1):
        max_value = 0
        max_pieces = []
        for piece_length, price in board:
            if i >= piece_length and dp[i - piece_length][1]:
                value = dp[i - piece_length][0] + price
                pieces = sorted(dp[i - piece_length][1] + [piece_length], reverse=True)
                if value > max_value or (value == max_value and len(pieces) > len(max_pieces)):
                    max_value = value
                    max_pieces = pieces
            elif i >= piece_length and dp[i - 1][0]:
                value = dp[i - 1][0]
                pieces = sorted(dp[i - 1][1] + [1], reverse=True)
                if value > max_value or (value == max_value and len(pieces) > len(max_pieces)):
                    max_value = value
                    max_pieces = pieces

        dp[i] = [max_value, max_pieces]

    return {"takings": dp[length][0], "pieces": dp[length][1]}
```