```python
def gen_plan(state: BridgeState, center_x: float, center_y: float, radius: float, push_offsets: list):
    
    import numpy as np

    # Calculate the target positions for each block to form a circle
    actions = []
    num_blocks = len(state.frames) - 1  # Exclude the table frame
    angle_step = 2 * np.pi / num_blocks

    for i, block in enumerate(state.frames[:-1]):  # Exclude the table frame
        # Calculate target position
        angle = i * angle_step
        target_x = center_x + radius * np.cos(angle)
        target_y = center_y + radius * np.sin(angle)

        # Calculate push start and end points with offsets
        start_x = block.x_pos + push_offsets[i][0]
        start_y = block.y_pos + push_offsets[i][1]
        end_x = target_x + push_offsets[i][2]
        end_y = target_y + push_offsets[i][3]

        actions.append(Action("push_motion", [start_x, start_y, end_x, end_y]))

    return actions

def gen_domain(initial: BridgeState):
    num_blocks = len(initial.frames) - 1  # Exclude the table frame
    # Assuming a generic offset for each push action
    push_offsets = ContinuousSampler(-.3, .3, shape=(num_blocks, 4))
    return {
        "center_x": ContinuousSampler(-.5, .5),
        "center_y": ContinuousSampler(-.5, .5),
        "radius": ContinuousSampler(.1, .3),
        "push_offsets": push_offsets,
    }
```